Внутреннее соединение SQL с пустыми записями - PullRequest
0 голосов
/ 31 октября 2019

Предполагая, что у меня есть две таблицы

Таблица машин

| id    | ip_address|
|-------|-----------|
|   1   |1.1.1.1    |
|   2   |1.1.1.2    |
|   3   |1.1.1.3    |
|   4   |1.1.1.4    |

Таблица расписаний

| id    | machine_id| reserved_date|user_id|
|-------|-----------|--------------|-------|
|  1    |    1      |  2019-10-31  |  1    |
|  2    |    2      |  2019-10-10  |  2    |
|  3    |    3      |  2019-10-31  |  4    |

В настоящее время мой запрос возвращает только те данные, которые удовлетворяютпредложение where (что и следовало ожидать), но мне нужно, чтобы я мог получить всю машину из таблицы машин, включая user_id из таблицы расписания, которая удовлетворяет предложению where.

SELECT machine.ip_address, schedule.user_id  FROM machine 
INNER JOIN schedule ON schedule.machine_id = machines_machine.id
WHERE schedule.reserved_date = '2019-10-31';

Ожидаемый результат:

| ip_address | user_id |
|------------|---------|
| 1.1.1.1    | 1       |
| 1.1.1.2    |         |
| 1.1.1.3    | 4       |
| 1.1.1.4    |         |

Мне нужно вернуть всю машину из таблицы машин плюс дополнительный столбец, который содержит только user_id резервирования, который удовлетворяет указанной дате.

Ответы [ 3 ]

1 голос
/ 31 октября 2019
SELECT machine. ip_address, schedule. user_id  
FROM machine 
LEFT JOIN schedule 
ON schedule. machine_id = machine. machine_id 
WHERE schedule. reserved_date='2019-10-31';
0 голосов
/ 31 октября 2019

используйте левое соединение вместо внутреннего соединения

SELECT machine.ip_address, schedule.user_id  FROM machine 
LEFT JOIN schedule ON schedule.machine_id = machines_machine.id
WHERE schedule.reserved_date = '2019-10-31';
0 голосов
/ 31 октября 2019

Соедините таблицы слева, переместите условие WHERE относительно столбцов таблицы, соединенных слева, в ON.

WITH Machines(id, ip_address) as (
 values 
    (1, '1.1.1.1')
   ,(2, '1.1.1.2')
   ,(3, '1.1.1.3')
   ,(4, '1.1.1.4')
),Schedule(id, machine_id, reserved_date, user_id) as (
 values 
    (1, 1, '2019-10-31', 1)
   ,(2, 2, '2019-10-10', 2)
   ,(3, 3, '2019-10-31', 4)
)
SELECT machines.ip_address, schedule.user_id  
FROM machines 
LEFT JOIN schedule ON schedule.machine_id = machines.id
                  AND schedule.reserved_date = '2019-10-31';

Dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...