当 1 列符合条件时,选择所有具有相同 ID 的行

Nic*_*las 2 sql-server

我需要有关 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 服务器上。

谢谢你的帮助

Wor*_*DBA 6

有几种方法可以实现这一目标......

您可以使用子查询返回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)

尝试每一个并查看为它们生成的执行计划,然后再选择哪个。通常,如果两个查询计划相同,我会选择更易于维护的查询。

执行示例和结果可以在sqlfiddle找到