有条件地加入查询
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
,您可以增加看起来的深度。正如我在评论中提到的那样,你不应该动态地这样做。这意味着您将受限于您选择编写的连接数量,因此如果您知道要查看部件的子部件的级别数,则此方法最有效。
我想有条件地将查询连接到自身。
查询:
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
,您可以增加看起来的深度。正如我在评论中提到的那样,你不应该动态地这样做。这意味着您将受限于您选择编写的连接数量,因此如果您知道要查看部件的子部件的级别数,则此方法最有效。