2016-09-22 33 views
1

我有一個包含原始記錄和取消記錄的表。原始記錄用代碼= 1標記,取消的記錄用代碼= 2標記。還有其他類型的代碼。我需要找到表中沒有取消記錄的所有原始記錄。如何在SQL中查找對

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

@ AT-2016 AFAIK取消取消活動記錄,所以它不應出現在結果集中。 –

+0

由於第1行在第3行中有取消記錄。在此表中,插入了一條新記錄用於取消。 – Jansvin

+0

@Tim明白了。謝謝。 –

回答

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) 
+0

這一個爲我工作。謝謝加文! – Jansvin

0

這個答案是最好用NOT EXISTS becauese它避免了相關子查詢。它也使用連接,這意味着它可以利用索引。

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 
+0

不確定join和subquery問題對使用索引有什麼影響。例如,請參閱http://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join。 –

+0

@GavinCampbell我並不是說一個索引只能用於連接,但是我的方法避免了一個相關的子查詢,總是一件好事。 –

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 

請讓我知道它是否有幫助。