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

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

我有一张table B 如下所示:

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

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

  1. DATE |
  2. ------------
  3. 2019-01-01 |
  4. 2019-01-02 |
  5. 2019-01-03 |
  6. ...

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

  1. SELECT
  2. A.DATE
  3. , B.STORE
  4. , B.PRODUCT
  5. , B.UNITS_SOLD
  6. FROM
  7. B AS SALES
  8. LEFT JOIN
  9. A AS DATES ON
  10. DATES.DATE = SALES.DATE
  11. WHERE
  12. B.STORE = 1
  13. AND B.PRODUCT = 'Beans'

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

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

我错过了什么?

ljo96ir5

ljo96ir51#

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

  1. SELECT
  2. A.DATE
  3. , B.STORE
  4. , B.PRODUCT
  5. , B.UNITS_SOLD
  6. FROM A AS DATES
  7. LEFT JOIN B AS SALES ON DATES.DATE = SALES.DATE
  8. AND B.STORE = 1
  9. AND B.PRODUCT = 'Beans'
dgjrabp2

dgjrabp22#

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

  1. SELECT
  2. A.DATE
  3. , B.STORE
  4. , B.PRODUCT
  5. , B.UNITS_SOLD
  6. FROM A AS DATES
  7. LEFT JOIN B AS SALES ON DATES.DATE = SALES.DATE;

相关问题