如何在SQL中查找对

时间:2016-09-22 04:52:29

标签: sql sql-server

我有一张包含原始记录和已取消记录的表格。原始记录用code = 1标记,取消的记录用code = 2标记。还有其他类型的代码。我需要找到表中没有取消记录的所有原始记录。

E.g。表1

id | column2 | column3 | code
-- |-------- | ------- | ---
 1 | abc     | def     | 1
 2 | xyz     | pqr     | 1
 3 | abc     | def     | 2

查询的结果应该是id为2的行,因为它尚未被取消。

我正在尝试使用自我加入

select * 
from table1 t1
 join table1 t2 on t1.column1=t2.column1
               and t1.column2=t2.column2
               and t1.code<t2.code
where not (t1.code=1 and t2.code=2)

3 个答案:

答案 0 :(得分:2)

SELECT  *
FROM    table1 AS t1
WHERE   code = 1
        AND NOT EXISTS ( SELECT *
                         FROM   table1 t2
                         WHERE  t2.code = 2
                                AND t2.column2 = t1.column2
                                AND t2.column3 = t1.column3 )

答案 1 :(得分:0)

这个答案比使用NOT EXISTS更可取,因为它避免了相关的子查询。它还使用连接,这意味着它可以利用索引。

SELECT t1.id,
       t1.column2,
       t1.column3,
       t1.code
FROM table1 t1
INNER JOIN
(
    SELECT column2,
           column3
    FROM table1
    GROUP BY column2,
             column3
    HAVING SUM(CASE WHEN code = 2 THEN 1 ELSE 0 END) = 0
) t2
    ON t1.column2 = t2.column2 AND
       t1.column3 = t2.column3

答案 2 :(得分:0)

您可以使用CTE。 查找代码总和,因为它是整数。如果它大于1,则表示此值的某处有2。

;WITH CTE AS
(
    Select column1,column3 from Table1
    GROUP BY column1,column3
    HAVING SUM(code)=1
)

SELECT t.id,CTE.* FROM CTE
INNER JOIN @temp t ON t.column1=CTE.column1 AND t.column3=CTE.column3

如果有帮助,请告诉我。