简体   繁体   English

将左外部联接转换为where语句

[英]Convert left outer join to where statement

I am looking to simplify this confusing left outer join statement into something easier to read by possibly using a where-statement 我希望通过使用where语句将这个令人困惑的左外部联接语句简化为更易于阅读的内容

Select approved.orderId
From  (select distinct orderId from OrderLine where isApproved = 1 and isDismissed = 0) approved
      left outer join 
      (select distinct orderId from OrderLine where isApproved = 0 and isDismissed = 0) unapproved 
      on approved.orderId = unapproved.orderId
Where unapproved.orderId Is Null

To something like: 像这样:

Select orderId
From  (select distinct orderId from OrderLine where (isApproved = 1 and isDismissed = 0) OR (isApproved = 0 and isDismissed = 0 and orderId is null))

This should do: 应该这样做:

SELECT DISTINCT O.orderId
FROM OrderLine O
WHERE O.isDismissed = 0
AND O.isApproved = 1
AND NOT EXISTS( SELECT 1 FROM OrderLine
                WHERE isApproved = 0
                AND isDismissed = 0
                AND orderId = O.OrderId)

It looks like the join is trying to get orders that have at least one approved line but no unapproved lines. 看起来该联接正在尝试获取至少具有一个批准行但没有未批准行的订单。 That should equate to 那应该等于

select distinct orderId 
from OrderLine
where isApproved = 1 
  and isDismissed = 0
  AND orderID NOT IN 
      (select orderId 
       from OrderLine 
       where isApproved = 0 
         and isDismissed = 0)

except should work pretty fast for your usecase, and remove the need for both joins and inner queries: except可以在您的用例中快速运行,并消除了对联接和内部查询的需求:

SELECT DISTINCT orderId
FROM   orderline
WHERE  isApproved = 1 and isDismissed = 0
EXCEPT
SELECT orderId
FROM   orderline
WHERE  isApproved = 0 and isDismissed = 0

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

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