简体   繁体   English

使用SQL Server从同一表的2列中提取相关记录

[英]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)

SQLFiddle here . SQLFiddle 在这里

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.

相关问题 使用SQL确定相关表的所有记录是否具有相同的值 - Using SQL to determine if all records of a related table have the same value SQL Server-使用同一表中的字段和其他表中的值,更新所有表记录中的字段 - SQL Server - Update field in all table records, using a field from the same table and values from other table 在SQL的同一张表中分离出相关记录 - Separating out related records in same table in sql 如何使用存储过程 SQL Server 从表中复制记录并插入到同一个表中 - How to copy records from table and insert into same table using stored procedure SQL Server 使用SQL从XML提取相关数据 - Extracting related data from XML using SQL 使用表和列相同的代码将一组记录从Oracle复制到SQL Server的最佳方法是什么? - What is the best way to copy a set of records from Oracle to SQL Server using code where table and columns are identical? 从sql server中的同一个表中获取匹配的记录 - Fetch the matching records from the same table in sql server 如何从SQL Server中相关表中具有特定行数的表中选择记录? - How to select records from a Table that has a certain number of rows in a related table in SQL Server? 用php从sql表中提取列 - Extracting columns from sql table with php SQL Server:使用另一个表中的记录更新表 - SQL Server : update table using records from another table
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM