【问题标题】:How do I get this Right outer join to work?如何让这个右外部连接起作用?
【发布时间】:2019-05-06 18:22:04
【问题描述】:

我正在尝试显示所有销售订单,如果有的话,还会显示交货单。我有一个显示所有订单的查询,但无论我如何将它加入到下一个表中,我都会继续获得只有带有交货单的订单的结果。如果没有记录在案,我希望 NULL 出现在交货单上。

我尝试了左、右和内连接,它们都返回相同数量的结果,这让我感到困惑。我以为我在今天之前对join有所了解。

这部分显示存在多少销售订单。我希望所有结果都出现在下一个查询中

select t0.docnum SalesOrder, t1.itemcode, t1.linenum rdr1line
from ordr t0 inner join rdr1 t1 on t1.docentry = t0.docentry
where t0.CANCELED = 'N';

这部分显示有多少销售订单有交货单,但不包括没有交货单的订单。

select t0.docnum SalesOrder, t1.itemcode, t2.docnum DelivNoteNum, t3.baseline inv1base, t1.linenum rdr1line, t3.linenum dln1line
from ordr t0 inner join rdr1 t1 on t1.docentry = t0.docentry
right outer join odln t2 on t2.docentry = t1.trgetentry
right outer join dln1 t3 on t3.docentry = t2.docentry and t3.baseline = t1.linenum and t3.ItemCode = t1.ItemCode
where t0.CANCELED = 'N' and t2.canceled = 'N';

预期结果应该是每个表中相同的行数。实际结果仅与交货单一起订购。

【问题讨论】:

    标签: sql crystal-reports sapb1


    【解决方案1】:

    使用left join,而不是right join。如果您想要所有订单,请从该表开始。后续表的过滤器应该进入on 子句:

    select t0.docnum SalesOrder, t1.itemcode, t2.docnum DelivNoteNum,
           t3.baseline inv1base, t1.linenum rdr1line, t3.linenum dln1line   
    from ordr t0 left join
         rdr1 t1
         on t1.docentry = t0.docentry left join
         odln t2
         on t2.docentry = t1.trgetentry and t2.canceled = 'N' left join
         dln1 t3
         on t3.docentry = t2.docentry and
            t3.baseline = t1.linenum and
           t3.ItemCode = t1.ItemCode
    where t0.CANCELED = 'N';
    

    【讨论】:

    • 这绝对是我想要达到的目标。是不是因为我的过滤器都位于 where 子句中,所以无论加入如何,我都得到相同的结果?
    • 我还发现 (t0.CANCELED = 'N' or t2.CANCELED = 'N' or t4.Canceled = 'N') 获得相同的期望结果。
    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 2012-12-08
    • 2010-10-30
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多