2011-08-12 90 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