2011-08-12 137 views
1

myTable具有由列A和B(總列A,B,C,D,E)組成的組合鍵。幫助需要一個複雜的自連接sql查詢

我想要排除/忽略D(例如訂單號)的值相同且E(例如決策)在Y中是一個,但N或Null在其他中的記錄。 (意味着所有具有相同訂單號(等於D值)的雙記錄首先被排序(因此E = Y)然後再被取消(因此E = N)應該被忽略)

因此,我拔出A, B中的所有記錄,其中d是相同的,但E是的Y和n之一在其他

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

現在我的最終輸出應爲myTable的所有記錄,但上面沒有發現的記錄。

我寫了一個連接查詢,但它不工作,因爲它應該。基本問題是如何比較兩個複合鍵?

樣本數據:

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

因此,我的輸出應記錄2,4和5。1和3將被忽略。由於1.D = 3.D和1.E爲Y,但3.E是N.

感謝, 聶

+0

究竟是你想怎麼辦,爲什麼不從myTable的寫 SELECT * WHERE CANCEL_FLAG =「XYZ」 如果我理解正確的,你想要什麼!? – elevener

+0

@elevener:更新了問題 – Nik

+0

您可以提供一些示例數據,然後針對該示例數據給出您想要的結果嗎?這會使你的問題容易理解30倍。 –

回答

0

如果我已經正確地理解了y OU,你需要的是這樣的:

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」。

爲什麼不直接像這樣直接查詢?

select * 
from myTable 
where D <> 'XYZ' 

Temp排除行,你可以:

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