繁体   English   中英

复杂的自联接 sql 查询需要帮助

[英]Help required with a complex self join sql query

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

我想排除/忽略其中 D 的值(例如订单号)相同且 E(例如决策)是 Y 的记录,但 N 或 Null 的记录。 (意味着所有具有相同订单号(等于 D 值)的双记录,首先订购(所以 E=Y)然后再次取消(所以 E=N)应该被忽略)

所以我为所有 D 相同但 E 是 Y 和 N 在其他的所有记录中提取了 A、B

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

现在我的最终 output 应该是 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
=========================

因此,我的 output 应该是记录 2,4 和 5。因为 1 和 3 将被忽略。 因为 1.D = 3.D 和 1.E 是 Y 但 3.E 是 N。

谢谢,尼克

我想排除 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

你需要类似的东西

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM