查找所有 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

希望对您有所帮助。