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;