有条件地加入查询

Conditionally join a query

我想有条件地将查询连接到自身。

查询:

SELECT Part, MtlPart, Qty
FROM Mtl

结果:

Part       MtlPart       Qty
   1          100         1
   1          101         2
   1          102         2
   2          200         1
   2          201         1
 100          120         1
 100          121         1
 100          122         1
 120          A20         1
 120          A21         1

MtlParts 也是零件。我要做的是将此查询与其自身连接起来,以便获得连接部分的列表。

例如:

SELECT *
FROM
   (SELECT Part, MtlPart, Qty
   FROM Mtl) AS A
INNER JOIN
   (SELECT Part, MtlPart, Qty
   FROM Mtl) AS B
ON a.MtlPartNum = b.PartNum
WHERE Part = 1

会 return 是这样的:

   a.Part      a.MtlPart     a.Qty      b.Part      b.MtlPart    b.Qty
       1          100         1            100         120          1
       1          100         1            100         121          1
       1          100         1            100         122          1
       1          101         1           NULL        NULL        NULL
       1          102         1           NULL        NULL        NULL

我想将此查询与其自身连接,直到连接的查询 return 只有空值。在此示例中,第 1 部分将 return 数据直到到达 MtlParts A20 和 A21,因为它们未列为零件。

老实说,我不确定执行此操作的最佳方法。非常感谢任何帮助或建议。

您的查询看起来是一种合理的方法,尽管您似乎想要外部联接而不是内部联接。我会消除子查询并添加别名:

SELECT a.Part, a.MtlPart, a.Qty, b.Part, b.MtlPart, b.Qty
FROM Mtl A LEFT JOIN
     Mtl B
     ON a.MtlPartNum = b.PartNum
WHERE A.Part = 1;

如果您只想进入有限数量的嵌套级别,那么您应该简单地为每个级别多次重新加入 table 本身,然后 select 从子 table。根据您的示例,它应该看起来像这样:

SELECT A.Part     As APart,
       A.MtlPart  As AMtlPart,
       A.Qty      As AQty,
       B.Part     As BPart,
       B.MtlPart  As BMtlPart,
       B.Qty      As BQty,
       C.Part     As CPart,
       C.MtlPart  As CMtlPart,
       C.Qty      As CQty,
FROM Mtl AS A
    Left Outer JOIN Mtl AS B
        ON A.MtlPartNum = B.Part
    Left Outer JOIN Mtl AS C
        ON B.MtlPartNum = C.Part
WHERE A.Part = 1

这将产生结果集

APart     AMtlPart   AQty    BPart     BMtlPart   BQty    CPart   CMtlPart   CQty
1         100        1       100       120        1       120     A20        1
1         100        1       100       120        1       120     A21        1
1         100        1       100       121        1       Null    Null       Null
1         100        1       100       122        1       Null    Null       Null
1         101        1       Null      Null       Null    Null    Null       Null
1         102        1       Null      Null       Null    Null    Null       Null

通过添加更多 Joins,您可以增加看起来的深度。正如我在评论中提到的那样,你不应该动态地这样做。这意味着您将受限于您选择编写的连接数量,因此如果您知道要查看部件的子部件的级别数,则此方法最有效。