有条件地加入查询

时间:2015-01-13 16:58:39

标签: sql sql-server

我想有条件地将查询加入到自身。

查询:

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

会返回类似的内容:

   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

我希望将此查询加入到自身,直到联接查询仅返回空值。在此示例中,第1部分将返回数据,直到达到MtlParts A20和A21,因为它们未被列为部件。

老实说,我不确定最好的方法。任何帮助或建议都非常感谢。

2 个答案:

答案 0 :(得分:1)

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

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;

答案 1 :(得分:1)

如果您只想访问有限数量的嵌套级别,那么您应该多次为每个级别重新加入表格,然后从子表格中选择。根据您的示例,这应该是这样的:

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,您可以增加看起来的深度。正如我在评论中提到的,你不应该动态地这样做。这意味着您只能选择要编写多少个连接,因此如果您知道要查看零件子零件的级别,此方法最有效。