如何解决SQL选择内部联接2列
我有一些表,我们称它们为表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,Username varchar(150),Position varchar(150));
INSERT INTO @UserManagement(Username,Position) VALUES
('Bryan','Client'),('Frey',('Will','Vendor'),('Belle','Vendor');
查询
;with mb_split_cte(ID,FromUser,[Message]) as (
select ID,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对您的问题的古兹曼评论。他建议使用很好的STRING_SPLIT function,但此功能在MS SQL Server 2014及更高版本中不可用。参见:Compatibility Level
要获取Mailbox
数据(每个ToUser
用逗号分隔成几行),可以使用CTE。参见:
DECLARE @Mailbox TABLE(ID int identity(1,[Message] varchar(250))
INSERT INTO @Mailbox(FromUser,'Hello')
;WITH CTE AS
(
--initial query
SELECT ID,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,LEFT(remainder,remainder)-1) ToUser,RIGHT(remainder,LEN(remainder) - CHARINDEX(',remainder)) remainder,[Message]
FROM CTE
WHERE CHARINDEX(',remainder)>0
UNION ALL
SELECT ID,remainder ToUser,NULL remainder,remainder)=0
)
SELECT ID,[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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。