完全外部联接仅采用左表(但不包括where子句)

时间:2019-01-08 22:17:47

标签: sql sql-server outer-join

我遇到了一个似乎无法解决的问题。在纸上看起来很简单,但是由于这对我来说仍然很新,我想我缺少明显的东西了。

我有2个表,其中包含:

  • 数量:日期,产品代码和编号
  • Rev:日期,产品代码和收入

所需的输出是:日期,产品代码,编号和收入(基本上,我想将它们合并)。问题是,我可能有一些数量在Rev中不存在的产品,而某些产品在Rev中不存在于Rev中。我的猜测是使用以下代码:

SELECT Rev.Date
    ,ISNULL(rev.Prd,Qty.Prd) as ProductCode
    ,ISNULL(Sum(Number),0) as Number
    ,ISNULL(SUM(Revenue),0) as Revenue
FROM Rev
FULL OUTER JOIN Qty ON rev.Date=Qty.Date AND rev.Prd=Qty.Prd
GROUP BY rev.Date, rev.Prd, Qty.Prd
ORDER BY rev.Date

但是,尽管我进行了所有测试,但我还是感到绝望,尽管我仍然在“数量”表中缺少一些产品代码(但是,我确实有来自Rev的产品代码不在“数量”中)。

我在网上找到的大多数答案都与“地方条款”存在某些冲突,但我没有任何冲突。我在这里误会什么吗?谢谢!

编辑: 这是我的数据:

TABLE Rev                               TABLE Qty       
Date        |   Prd   | Revenue         Date        |   Prd   | Number
------------|---------|-----------      ------------|---------|-------
07/09/2018  |   ProdA | 100             07/09/2018  |   ProdA | 1
07/09/2018  |   ProdB | 200             07/09/2018  |   ProdB | 1
07/09/2018  |   ProdC | 0               07/09/2018  |   ProdC | 1
07/09/2018  |   ProdD | 150             07/09/2018  |   ProdD | 3
07/09/2018  |   ProdE | 0               07/09/2018  |   ProdE | 1
07/09/2018  |   ProdF | 0               07/09/2018  |   ProdF | 2
07/09/2018  |   ProdH | 120             07/09/2018  |   ProdH | 8
07/09/2018  |   ProdI | 200             07/09/2018  |   ProdI | 3
07/09/2018  |   ProdX | 500             07/09/2018  |   PRODZ*| 1

并且低于我当前的输出以及所需的输出:

OUTPUT                                     DESIRED          
Date        |   Prd   | Number |Revenue    Date        |    Prd   | Number |Revenue 
------------|---------|------------------  ------------|----------|-----------------
07/09/2018  |   ProdA | 1      |100        07/09/2018  |    ProdA | 1      |100
07/09/2018  |   ProdB | 1      |200        07/09/2018  |    ProdB | 1      |200
07/09/2018  |   ProdC | 1      |0          07/09/2018  |    ProdC | 1      |0
07/09/2018  |   ProdD | 3      |150        07/09/2018  |    ProdD | 3      |150
07/09/2018  |   ProdE | 1      |0          07/09/2018  |    ProdE | 1      |0
07/09/2018  |   ProdF | 2      |0          07/09/2018  |    ProdF | 2      |0
07/09/2018  |   ProdH | 8      |120        07/09/2018  |    ProdH | 8      |120
07/09/2018  |   ProdI | 3      |200        07/09/2018  |    ProdI | 3      |200
07/09/2018  |   ProdX | 0      |500        07/09/2018  |    ProdX | 0      |500
                                           07/09/2018  |    PRODZ*| 1      |0

PRODZ *是我所有测试中缺少的一个。

1 个答案:

答案 0 :(得分:2)

您的GROUP BY在左表中是主要的。

所有不匹配的行将分别具有NULLrev.date的{​​{1}}值,因此将它们全部合并为结果集中的一行。

大概是您打算的:

rev.prd

使用SELECT COALESCE(Rev.Date, qty.Date) as date COALESCE(rev.Prd, Qty.Prd) as ProductCode COALESCE(Sum(Number), 0) as Number COALESCE(SUM(Revenue), 0) as Revenue FROM Rev FULL OUTER JOIN Qty ON rev.Date = Qty.Date AND rev.Prd = Qty.Prd GROUP BY COALESCE(Rev.Date, qty.Date), COALESCE(rev.Prd, Qty.Prd) ORDER BY COALESCE(Rev.Date, qty.Date); 的查询通常会处理大量FULL JOIN