Получить данные левой таблицы полностью, даже если в правой объединенной таблице нет ссылки - PullRequest
0 голосов
/ 06 ноября 2019

Используемая база данных: SQL Server

У меня есть три таблицы A, B, C.

ТАБЛИЦА A:

------------------
| ID    |  Name  |
------------------
| 1     |   X    |
------------------
| 2     |   Y    |
------------------

ТАБЛИЦА B:

----------------------
|  ID   |  Date      | 
----------------------
|  1    | 2019-11-06 |
----------------------
|  2    | 2019-11-05 |
----------------------

ТАБЛИЦА C:

----------------------------------
| ID    | B.ID  | A.ID  | Amount |
----------------------------------
| 1     |  1    |  1    | 500    |
----------------------------------
| 2     |  2    |  2    | 1000   |
----------------------------------

Результат, который я хотел бы получить, - это все записи таблицы A.Name с их количеством в таблице C.amount, где таблица B.Date = 2019-11-06,Набор результатов должен включать все записи A.name, даже если он не имеет ссылки в таблице C.

Требуемый результат:

-----------------------
| A.Name   | C.Amount |
-----------------------
| X        |   500    |
-----------------------
| Y        |   NULL   |
-----------------------

Код, с которым я пытался:

SELECT A.Name,C.Amount
FROM A 
LEFT OUTER JOIN C ON C.A_ID=A.ID
LEFT OUTER JOIN B ON B.ID = C.B_ID ON 
WHERE B.Date='2019-11-06'

Результат, который я получил с помощью приведенного выше кода:

------------------
| Name  | Amount |
------------------
| X     |  500   |
------------------

В результате нет Y, потому что в эту конкретную дату нет записи для Y. Я просто хочу показать Y и сумму как ноль или ноль.

SQL Fiddle с моим запросом

Пожалуйста, помогите мне с этим.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Попробуйте это -

Fiddle Here

SELECT A.Name,C.Amount
FROM A
LEFT JOIN B ON A.ID = B.ID AND B.Date = '2019-11-06'
LEFT JOIN C ON B.ID = C.ID

Выход -

Name    Amount
X       500
Y       (null)
0 голосов
/ 06 ноября 2019

Нет никакой связи между вашим A and B, поэтому нам нужно сгруппировать B and C, используя subquery для фильтрации с date перед выполнением левого соединения.

SELECT A.Name, t1.Amount
FROM A 
LEFT JOIN
  (SELECT C.A_ID, C.Amount FROM C 
    INNER JOIN B ON B.ID = C.B_ID 
    WHERE B.Date='2019-11-06') t1
     ON t1.A_ID=A.ID

см. dbfiddle

...