在mysql中,如果右表中缺少键值,如何进行左连接?

k5ifujac  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(236)

我有一张table B 如下所示:

DATE       | STORE | PRODUCT | UNITS_SOLD |  
-------------------------------------------
2020-01-01 |     1 | Beans   | 10         |
2020-01-03 |     1 | Beans   | 5          |
2020-01-01 |     2 | Carrots | 6          |
...        |   ... | ...     | ...        |

重要的一点是,并不是每个日期都有一行。
我想基本上'填写'丢失的日期和有空值在其他列。我试着用一张table来做这个 A 这只是一个连续日历日期的列表,即。

DATE       |
------------
2019-01-01 |
2019-01-02 |
2019-01-03 |
...

我为此编写的sql是(我试图通过限制一个商店和一个产品来保持它的简单性):

SELECT 
    A.DATE
  , B.STORE
  , B.PRODUCT
  , B.UNITS_SOLD
FROM
    B AS SALES
LEFT JOIN
    A AS DATES ON
      DATES.DATE = SALES.DATE
WHERE
        B.STORE = 1
    AND B.PRODUCT = 'Beans'

但它只是返回日期所在的行 B . 我也尝试过将where子句中的条件移到join内部,并添加 '...OR IS NULL'. 我想要的是:

DATE       | STORE | PRODUCT | UNITS_SOLD |  
-------------------------------------------
2020-01-01 |     1 | Beans   | 10         |
2020-01-02 |  null | null    | null       |
2020-01-03 |     1 | Beans   | 5          |
...        |   ... | ...     | ...        |

我错过了什么?

ljo96ir5

ljo96ir51#

在执行左联接时,联接左侧的表将返回右侧表中的所有行和匹配行。因为你需要所有的日期,它将是表a在左手边。
另外,您必须小心使用过滤器,因为它必须与联接一起限制从右侧表联接的数据,否则它将从整体输出中剪切数据。

SELECT 
  A.DATE
, B.STORE
, B.PRODUCT
, B.UNITS_SOLD
FROM A AS DATES
LEFT JOIN B AS SALES ON DATES.DATE = SALES.DATE 
                    AND B.STORE = 1 
                    AND B.PRODUCT = 'Beans'
dgjrabp2

dgjrabp22#

实际上,你必须把日期表和销售表连接起来。

SELECT 
  A.DATE
, B.STORE
, B.PRODUCT
, B.UNITS_SOLD
FROM A AS DATES
LEFT JOIN B AS SALES ON DATES.DATE = SALES.DATE;

相关问题