复杂的自连接SQL查询所需的帮助

时间:2011-08-12 06:27:55

标签: sql key composite

myTable具有由A列和B列组成的复合键(总列A,B,C,D,E)。

我想排除/忽略记录,其中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.

谢谢, NIK

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

如果我正确理解你,你需要的是:

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