2016-09-22 22 views
1

元のレコードとキャンセルされたレコードを含むテーブルがあります。オリジナルレコードはcode = 1でマークされ、キャンセルされたレコードはcode = 2でマークされます。他のタイプのコードもあります。私は、テーブルにキャンセルレコードを持たないすべての元のレコードを見つける必要があります。SQLでペアを見つける方法

など。表1

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

クエリの結果は、取り消されていないため、IDが2の行にする必要があります。

私はこの答えは、それが相関サブクエリを回避becauese NOT EXISTSを使用することが好ましい自己結合

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 got it。ありがとう。 –

答えて

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

を使用しようとしています。また、結合を使用するため、インデックスを利用できます。

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 vs 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 

私が役に立ったら教えてください。

関連する問題