2011-08-12 14 views
1

myTableは、列AとB(合計列A、B、C、D、E)で構成される複合キーを持っています。複合自己結合SQLクエリで必要なヘルプ

Dの値(注文番号と同じ)が同じで、E(決定)が1でYが他の場合はNまたはNullであるレコードを除外/無視したいと考えています。 (E = Yであるため)最初に注文された後、再び取り消される(つまりE = N)無視されるべき同じ注文番号(等しいD値)を有するすべての双子レコードを意味する)

したがって、 Dは同じであるが、Eは、他の

SELECT * 
FROM myTable A, myTable B 
WHERE 
(A.D=B.D) 
AND 
((A.E ='Y' AND (B.E ='N' OR B.E IS NULL)) OR (B.E='Y' AND (A.E='N' OR A.E IS NULL))) 

の一方のYとNであるすべてのレコードのBは、今私の最終的な出力は、すべてのMYTABLEからのレコードではなく、上記見つかったレコードがなければなりません。

私は結合クエリを書いたが、それはうまくいかない。基本的に問題は、2つの複合キーを比較する方法ですか?

サンプルデータ:

A B  C  D  E 
=========================  
1 A  xyz ONE Y 
2 B  pqr TWO Y 
3 C  lmn ONE N 
4 D  abc THREE Y 
5 E  ijk FOUR Y 
========================= 

1と3が無視されるようにこのように、私の出力は、レコード2,4および5にする必要があります。 1.D = 3.Dと1.EはYですが3.EはN.に

おかげなので、 ニック

+0

:OU、何が必要このですか? – elevener

+0

@elevener:質問 – Nik

+0

を更新しました。サンプルデータを入力して、そのサンプルデータに対して望ましい結果を与えることはできますか?それはあなたの質問を30倍に理解しやすくします。 –

答えて

0

のようなものが必要な場合は、私はyを正しく理解した!まさにあなたがすると私はあなたが欲しいものを正しく理解している場合、なぜmytableはWHERE CANCEL_FLAG =「XYZ」 から SELECT *を書くことではないしようとしている何

select x.* 
from mytable x left outer join 
    ( select mt1.a, mt1.b 
     from mytable mt1 inner join 
      mytable mt2 on mt1.d = mt2.d 
     where ((mt1.E ='Y' AND (mt2.E ='N' OR mt2.E IS NULL)) OR (mt2.E='Y' AND (mt1.E='N' OR mt1.E IS NULL))) 
    ) y on x.a = y.a and x.b = y.b 
where y.a is NULL 
1

私はDの値が "XYZ" であるレコードを除外します。

なぜこのようなクエリを直接行うのはなぜですか? Tempから行を除外するために

select * 
from myTable 
where D <> 'XYZ' 

、あなたはできます

select * 
from myTable 
where not exists 
     (
     select * 
     from temp 
     where myTable.A = temp.A 
       and myTable.B = temp.B 
     ) 

または排他左では参加:

select * 
from myTable 
left join 
     temp 
on  myTable.A = temp.A 
     and myTable.B = temp.B 
where temp.A is null 
+0

質問を更新しました – Nik

0

あなたは

select A.* 
from myTable A 
WHERE (SELECT COUNT(*) FROM myTable B WHERE B.D = A.D AND (B.E IS NULL OR B.E = 'N')) = 0