[英]Extracting related records from 2 columns in the same table using sql server
I want to get the list of friends in the following query, but I'm getting an infinite loop, Here's my sample data: 我想在以下查询中获取朋友列表,但是却遇到了无限循环,这是我的示例数据:
DECLARE @T TABLE (Name nvarchar(50), Friends nvarchar(50))
INSERT INTO @T VALUES
('Joe','Jean'),
('Mike','Jean'),
('Jean','Zaki'),
('Zaki','Ali'),
('Mimi','Nana'),
('Mimi','Jean'),
('Chico','Yari')
and the query itself: 和查询本身:
;WITH cte AS
(SELECT name rootname, t.* FROM @t t WHERE name = 'Joe'
UNION ALL
SELECT c.rootname, t.*
FROM cte c
JOIN @t t ON c.friends IN (t.name, t.friends) AND
t.name NOT IN (c.rootname, c.name)
)
SELECT name FROM cte UNION SELECT friends FROM cte
OPTION (maxrecursion 0)
(Updated) One way: (更新)一种方式:
;WITH cte AS
(SELECT convert(nvarchar(max),';'+name+';') namelist, t.Name, t.friends
FROM @t t WHERE name = 'Joe'
UNION ALL
SELECT convert(nvarchar(max),c.namelist+c.Friends+';'),
c.Friends,
case c.friends when t.name then t.friends else t.name end
FROM cte c
JOIN @t t
ON c.friends IN (t.name, t.friends) AND
charindex(';'+case c.friends when t.name then t.friends else t.name end+';',
c.namelist)=0
)
SELECT name FROM cte UNION SELECT friends FROM cte
OPTION (maxrecursion 0)
declare @T table (Name nvarchar(50), Friends nvarchar(50))
insert into @T values
('Joe','Jean'),
('Mike','Jean'),
('Jean','Zaki'),
('Zaki','Ali'),
('Mimi','Nana'),
('Chico','Yari'),
('Joe','Yari'),
('Mimi','Jean'),
('Mimi','Zaki'),
('Chico','Jean')
SELECT DISTINCT Name , STUFF(Flist, 1, 2, '') AS FriendsList
FROM @T t CROSS APPLY (
SELECT ', ' + Friends [text()]
FROM @T t2
WHERE t2.name = t.name
FOR XML PATH('')
)L(Flist)
This will give you list of all the friends for each name like this .. 这将为您提供每个朋友的所有列表,例如:
Result Set 结果集
Name FriendsList
Chico Yari, Jean
Jean Zaki
Joe Jean, Yari
Mike Jean
Mimi Nana, Jean, Zaki
Zaki Ali
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.