Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自引用表的Sql查询_Sql_Sql Server - Fatal编程技术网

自引用表的Sql查询

自引用表的Sql查询,sql,sql-server,Sql,Sql Server,我有一个表(ms sql 2008),用于存储用户替换。其形式如下: | ID| U1| U2| | 1 | A | B | | 2 | B | C | | 3 | C | D | 用户A被用户B替换。然后B被C替换,然后C被D替换。替换可能是1-n 如何将(逻辑)结果放在一行中,此时A被D替换 | A | D | 使用可以找到每行的最终替换项 WITH RCTE AS ( SELECT ID, U1, U2, 1 AS Lvl FROM dbo.table1 --W

我有一个表(ms sql 2008),用于存储用户替换。其形式如下:

| ID| U1| U2|

| 1 | A | B |

| 2 | B | C |

| 3 | C | D |
用户A被用户B替换。然后B被C替换,然后C被D替换。替换可能是1-n

如何将(逻辑)结果放在一行中,此时A被D替换

| A | D |
使用可以找到每行的最终替换项

WITH RCTE AS
(
    SELECT ID, U1, U2, 1 AS Lvl 
    FROM dbo.table1 --WHERE ID = 1
    UNION ALL
    SELECT r.ID, r.U1, t1.U2, r.Lvl + 1 
    FROM dbo.table1 t1
    INNER JOIN RCTE r ON r.U2 = t1.U1 AND t1.ID > r.ID
)
, CTE_RN AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Lvl DESC) RN 
    FROM RCTE
)
SELECT ID, u1, U2 AS FinalReplacement
FROM CTE_RN c
WHERE RN = 1 
AND NOT EXISTS (SELECT * FROM dbo.table1 t1 WHERE c.u1 = t1.U2)

建立最终替换表。这意味着您不必编写查询,只需执行一次查找,速度会快得多。如果您的行的值也是D,A,该怎么办?你能澄清一下你的输入和输出吗?您是否有2个用户ID作为输入?是的,用户D可能被用户A替换,是的,我有2个用户ID。因此,您能否澄清您输入了什么以及您希望如何获得输出。是不是“这里是user1,这里是user2,user1是否可以被user2取代”?我想这很清楚。我有你在代码1中看到的表,存储过程的输出应该是代码2。我刚刚试过,Nenad,如果用户D被替换为。@ConstantinosG,则会有一个无限循环。假设您表中的ID反映了替换的顺序,您可以将r.U2=t1.U1上的“替换”更改为r.U2=t1.U1上的“替换”,并且r.ID>t1.ID。@Taemyr:ID确实反映了顺序,但您的命题给出了错误的结果。@ConstantinosG。请更新问题中的样本数据和预期结果,以了解其他要求。如果用户D被A替换,那么当然会有无限循环。在这种情况下,您希望的输出是什么?@Nenad:如果D被A替换,输出应该是空的(没有行)。