Как мне выполнить LEFT JOIN в MySQL, когда у меня отсутствуют ключевые значения в RIGHT таблице? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть таблица B, которая выглядит следующим образом:

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

Важным моментом является то, что для каждой даты нет строки.

Я бы хотел по сути, «заполните» отсутствующие даты и оставьте нулевые значения в других столбцах. Я пытался сделать это, оставив соединение с таблицей 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 внутрь соединения и добавить '...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          |
...        |   ... | ...     | ...        |

Что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

На самом деле вам нужно выйти, чтобы присоединиться к таблице DATES с таблицей SALES.

SELECT 
  A.DATE
, B.STORE
, B.PRODUCT
, B.UNITS_SOLD
FROM A AS DATES
LEFT JOIN B AS SALES ON DATES.DATE = SALES.DATE;
0 голосов
/ 25 мая 2020

При выполнении левого соединения таблица с левой стороны соединения является той, которая возвращает все строки и только соответствующие строки из правой таблицы. Поскольку вам нужны все даты, это будет таблица 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...