我继承了两个表:
表1:Loc
LocID Field1 Field2
---------------------------
1 AAA BBB
2 CCC DDD
3 EEE FFF
4 GGG HHH
5 III JJJ
6 KKK LLL
7 MMM NNN
8 OOO PPP
9 QQQ RRR
10 SSS TTT
11 UUU VVV
表2:LocRel
LocID_A LocID_B
-----------------------
1 2
1 3
2 4
2 5
3 6
3 7
5 11
8 9
8 10
因此,LocRel
表基本上用于指定Loc
表中各种记录之间的关系。
我正在努力编写一个sql语句,列出所有关系,如:
LocID Level LocIDH_Ancestry Field1 Field2
---------------------------------------------------
1 1 NULL AAA BBB
2 2 1 CCC DDD
3 2 1 EEE FFF
4 3 1,2 GGG HHH
5 3 1,2 III JJJ
6 3 1,3 KKK LLL
7 3 1,3 MMM NNN
8 1 NULL OOO PPP
9 2 8 QQQ RRR
10 2 8 SSS TTT
11 4 1,2,5 UUU VVV
在涉及人际关系的问题中我一点也不擅长,并且非常感谢有关如何实现上述目标的一些帮助。
谢谢大家!
答案 0 :(得分:1)
此答案可能是特定于SQL Server的。我不是SQL的专家,所以我不知道其中有多少是标准的和/或在其他dbms中采用的。
您可以使用递归查询实现您提到的查询类型。 Here是主题的介绍,提供了一个很好的起点。
对于您的特定查询,这样的事情应该可以完成。
WITH MyCTE AS
(
SELECT
LocID, 1 as Level,
NULL as LocIDH_Ancestry,
Field1, Field2
FROM
Table1
WHERE
LocID NOT IN (SELECT LocID_B FROM Table2)
UNION ALL
SELECT
t1.LocID,
c.Level + 1 as Level,
t2.LocID_A as LocIDH_Ancestry,
t1.Field1, t1.Field2
FROM
Table1 t1
INNER JOIN
Table2 t2 ON t1.LocID = t2.LocID_A
INNER JOIN
MyCTE c ON t2.LocID_B = c.LocID
)
SELECT *
FROM MyCTE
希望有所帮助。