SQL内部联接,带空白条目

时间:2019-10-31 10:08:40

标签: sql database postgresql

假设我有两个表

机台

| 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 个答案:

答案 0 :(得分:1)

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';

答案 1 :(得分:0)

左联接表,将关于左联接表列的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

答案 2 :(得分:0)

使用innerjoin的左连接instade

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';