查找所有 parent 和 child 具有关系 table
Find all parent and child with a relationship table
我继承了两个table:
Table 1: 位置
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
Table 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
table 基本上是用来指定Loc
table.
中各个记录之间的关系
我正在努力编写一个 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
我不擅长涉及关系的查询,非常感谢您提供有关如何实现上述目标的帮助。
谢谢大家!
此答案可能 SQL 服务器特定。我不是 SQL 方面的专家,所以我不知道其中有多少是其他 dbms 采用的标准 and/or。
您可以使用递归查询来实现您提到的那种查询。 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
希望对您有所帮助。
我继承了两个table:
Table 1: 位置
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
Table 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
table 基本上是用来指定Loc
table.
我正在努力编写一个 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
我不擅长涉及关系的查询,非常感谢您提供有关如何实现上述目标的帮助。
谢谢大家!
此答案可能 SQL 服务器特定。我不是 SQL 方面的专家,所以我不知道其中有多少是其他 dbms 采用的标准 and/or。
您可以使用递归查询来实现您提到的那种查询。 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
希望对您有所帮助。