[英]SQL Select inner join 2 columns
我有一些表,我們稱它們為表UserManagement
ID Username Position
1 Bryan Client
2 Frey Client
3 Will Vendor
4 Anne Vendor
5 Belle Vendor
這是表Mailbox
ID FromUser ToUser Message
1 Bryan Will,Anne,Belle Hai
2 Anne Bryan,Frey Hello
我一直在嘗試這個:
select * from Mailbox t
inner join (select Username from UserManagement where Position = 'Client' group by Username)um
on t.ToUser = um.Username
但它的工作時,列ToUser
只包含用戶名Bryan
或者Frey
不與Bryan,Frey
如何解決,當列ToUser
包含用戶名像Bryan,Frey
?
這是一個查詢,它從“mb_split_cte”CTE 的郵箱表中拆分 ToUser 列。 然后它連接到用戶名上的 UserManagement 表。 然后它從郵箱表中返回 ToUsers 的管理職位。
數據
DECLARE @Mailbox TABLE(ID int identity(1,1),
FromUser varchar(150),
ToUser varchar(150),
[Message] varchar(250));
INSERT INTO @Mailbox(FromUser, ToUser, [Message])
VALUES('Bryan', 'Will,Anne,Belle', 'Hai'),
('Anne', 'Bryan,Frey', 'Hello');
DECLARE @UserManagement TABLE(ID int identity(1,1),
Username varchar(150),
Position varchar(150));
INSERT INTO @UserManagement(Username, Position) VALUES
('Bryan', 'Client'),
('Frey', 'Client'),
('Will', 'Vendor'),
('Anne', 'Vendor'),
('Belle', 'Vendor');
詢問
;with mb_split_cte(ID, FromUser, ToUser, [Message]) as (
select ID, FromUser, sp.[value], [Message]
from @Mailbox m
cross apply string_split(m.ToUser, ',') sp)
select msc.*, um.Position as ToUserPosition
from mb_split_cte msc
join @UserManagement um on msc.ToUser=um.Username;
輸出
ID FromUser ToUser Message ToUserPosition
1 Bryan Will Hai Vendor
1 Bryan Anne Hai Vendor
1 Bryan Belle Hai Vendor
2 Anne Bryan Hello Client
2 Anne Frey Hello Client
首先,請閱讀 Dan 對您的問題的 Guzman 評論。 他推薦使用STRING_SPLIT 函數,非常好,但該函數在 MS SQL Server 2014 及更早版本中不可用。 請參閱: 兼容級別
要按每個ToUser
將Mailbox
數據按逗號拆分為行,您可以使用CTE 。 看:
DECLARE @Mailbox TABLE(ID int identity(1,1), FromUser varchar(150), ToUser varchar(150), [Message] varchar(250))
INSERT INTO @Mailbox(FromUser, ToUser, [Message])
VALUES('Bryan', 'Will,Anne,Belle', 'Hai'),
('Anne', 'Bryan,Frey', 'Hello')
;WITH CTE AS
(
--initial query
SELECT ID, FromUser, LEFT(ToUser, CHARINDEX(',', ToUser)-1) ToUser, RIGHT(ToUser, LEN(ToUser) - CHARINDEX(',', ToUser)) remainder, [Message]
FROM @Mailbox
WHERE CHARINDEX(',', ToUser)>0
--recursive part
UNION ALL
SELECT ID, FromUser, LEFT(remainder, CHARINDEX(',', remainder)-1) ToUser, RIGHT(remainder, LEN(remainder) - CHARINDEX(',', remainder)) remainder, [Message]
FROM CTE
WHERE CHARINDEX(',', remainder)>0
UNION ALL
SELECT ID, FromUser, remainder ToUser, NULL remainder, [Message]
FROM CTE
WHERE CHARINDEX(',', remainder)=0
)
SELECT ID, FromUser, ToUser, [Message]
FROM CTE
ORDER BY ID
上面的查詢產生:
ID FromUser ToUser Message
1 Bryan Will Hai
1 Bryan Anne Hai
1 Bryan Belle Hai
2 Anne Bryan Hello
2 Anne Frey Hello
我已經使用了你的 SQL 代碼並稍微修改了它。 你為什么不試試呢?
select * from Mailbox t
inner join (select Username from UserManagement where Position = 'Vendor' group by Username)um
on t.ToUser like '%'+um.Username
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.