Sql 从表中选择所有行,其中一行的col1=另一行的col2?

Sql 从表中选择所有行,其中一行的col1=另一行的col2?,sql,sql-server,Sql,Sql Server,考虑表格的一个子部分: recId|Col1 |Val1 |Col2 |Val2 ________________________________________ 1|'Id' |'1' |NULL |NULL | 2|'EmpId'|'100' |'Id' |'1' | 3|'EmpId'|'101' |'Id' |'1' | 4|'KeyId'|'1110'|'EmpId'|'100' | 5|'EmpId'|'

考虑表格的一个子部分:

recId|Col1   |Val1  |Col2   |Val2
________________________________________
    1|'Id'   |'1'   |NULL   |NULL  |
    2|'EmpId'|'100' |'Id'   |'1'   |
    3|'EmpId'|'101' |'Id'   |'1'   |
    4|'KeyId'|'1110'|'EmpId'|'100' |
    5|'EmpId'|'101' |'KeyId'|'1111'|
    6|'Id'   |'2'   |NULL   |NULL  |
我想知道是否有办法从这个表中提取与第一行相关的所有记录,其中Id=@Id

在本例中,让@id=1

输出应该由行组成,其中Id=1的示例表中1,2,3,4,5中的recId由EmpId=101的行共享,而EmpId=101的行由KeyId=1111的行共享,以此类推

这可能吗

编辑: 感谢您,我已经了解了递归公共表表达式

这是我目前的工作

我不确定如何防止无限递归-我需要从当前迭代中排除早期迭代的结果。现在,“n”通过number限制了连接的深度数,但正如您所看到的,它在每次迭代中都重用来自cte的所有行

请帮我解决这个问题。谢谢。

首先你需要钥匙

SELECT Col1, Val1
FROM Yourtable t1
WHERE Col1 = 'Id'
  AND Val1 = @id
现在获取与该键匹配的所有行

SELECT *
FROM Yourtable t1
JOIN  ( SELECT Col1, Val1
        FROM Yourtable 
        WHERE col1 = 'Id'
          AND Val1 = @id ) t2
 ON t1.Col2 = t2.Col1
AND t1.Val2 = t2.Val1
使用递归CTE:


我相信这只会让你得到第1-3排。要获得所需的全部结果,您必须为此编写一个递归版本。@TabAlleman您是对的,他没有看到这一部分。请随意回答。我不能再补充我的答案了,对吗now@TabAlleman是的,我想应该是这样的,但我不知道如何在SQL中实现它。你见过递归cte示例吗?我没有,但我现在会查找它们。
SELECT Col1, Val1
FROM Yourtable t1
WHERE Col1 = 'Id'
  AND Val1 = @id
SELECT *
FROM Yourtable t1
JOIN  ( SELECT Col1, Val1
        FROM Yourtable 
        WHERE col1 = 'Id'
          AND Val1 = @id ) t2
 ON t1.Col2 = t2.Col1
AND t1.Val2 = t2.Val1
DECLARE @id integer = 1;

;WITH cte AS    (
    SELECT n=1, recid, col1, val1, col2, val2 
    FROM elbat
    WHERE col1 = 'Id' AND val1 = CAST(@id AS varchar(10))

    UNION ALL

    SELECT n=n+1, r.recid, r.col1, r.val1, r.col2, r.val2
    FROM cte p
    JOIN elbat r
      ON r.col2 = p.col1 AND r.val2 = p.val1
)
SELECT n, recid,col1,val1,col2,val2
FROM   cte
ORDER BY recid;