我有一张包含原始记录和已取消记录的表格。原始记录用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)
答案 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
如果有帮助,请告诉我。