我需要有关 SQL 查询的帮助。用一些例子可以更好地解释我的问题。
假设我从两个表 ORDR 和 RDRO 中提取了这样的数据。第一个表 (ORDR) 包含有关订单的所有数据,但项目除外。第二个表 (RDRO) 包含订单的所有项目信息。可以使用 [docNum] 连接两个表。
T0.docNum | T1.itemCode
123 EDS100
123 DDS200
123 DDS500
124 LLS220
124 LDS254
125 FGD450
125 LDS552
125 DDS200
125 EDD200
Run Code Online (Sandbox Code Playgroud)
当 1 个项目编号符合条件时,我想返回所有行。
假设在这种情况下,当一行等于 DDS200 时,我想要订单的所有行会给出以下结果:
T0.docNum | T1.itemCode
123 EDS100
123 DDS200 -- match
123 DDS500
125 FGD450
125 LDS552
125 DDS200 -- match
125 EDD200
Run Code Online (Sandbox Code Playgroud)
我确定这是微不足道的,我尝试了以下方法:
SELECT T0.docNum, T1.itemCode
FROM ordr T0 INNER JOIN rdro T1 ON T0.docNum = T1.docNum
WHERE T1.itemCode like 'DDS200';
Run Code Online (Sandbox Code Playgroud)
这仅返回符合条件的行,而不是如上所示的订单的所有行。
另外,请注意我在 SQL 服务器上。
谢谢你的帮助
有几种方法可以实现这一目标......
您可以使用子查询返回docNum
符合条件的行,RDRO
然后使用外部查询获取其余行;像这样:
SELECT r.docNum, r.itemCode
FROM (SELECT DISTINCT docNum
FROM rdro
WHERE itemCode = 'DDS200') AS a
JOIN rdro AS r
ON r.docNum = a.docNum;
Run Code Online (Sandbox Code Playgroud)
或者,正如 Aaron 所指出的,您也可以使用 aWHERE EXISTS
来实现相同的结果:
SELECT r.docNum, r.itemCode
FROM rdro as r
WHERE EXISTS (
SELECT *
FROM rdro
WHERE docNum = r.docNum
AND itemCode = 'DDS200');
Run Code Online (Sandbox Code Playgroud)
或者您可以使用WHERE...IN
:
SELECT r.docNum, r.itemCode
FROM rdro as r
WHERE r.docNum IN (
SELECT docNum
FROM rdro
WHERE itemCode = 'DDS200');
Run Code Online (Sandbox Code Playgroud)
或者你甚至可以直接在JOIN
:
SELECT r.docNum, r.itemCode
FROM rdro as r
JOIN rdro AS o
ON r.docNum = o.docNum
AND o.itemCode = 'DDS200';
Run Code Online (Sandbox Code Playgroud)
哎呀,为了完整性,我们甚至可以加入 CTE 版本:
WITH docs
AS
(SELECT docNum FROM RDRO WHERE itemCode = 'DDS200')
SELECT r.docNum, r.itemCode
FROM RDRO AS r
JOIN docs AS d
ON r.docNum = d.docNum;
Run Code Online (Sandbox Code Playgroud)
尝试每一个并查看为它们生成的执行计划,然后再选择哪个。通常,如果两个查询计划相同,我会选择更易于维护的查询。
归档时间: |
|
查看次数: |
16424 次 |
最近记录: |