left join if condition met, set to null
left join if condition met , set to null
我正在尝试为以下 table 编写一个 sql 连接查询。
我正在尝试按预期获得 table。
唯一的连接条件是,如果在table 1中,操作的值为'D'即删除,那么table 2中的行对应的值为null .
table根据密钥加入。
数据库:POSTGRES
Table 1
id | operation| keys|
-----------------------
1 | I | 1 |
2 | U | 2 |
3 | D | 3 |
Table 2
id |keys| col1| col2
-----------------------
1 | 1 | xyz | abc
2 | 2 | yxz | cba
3 | 3 | zxy | bac
预期输出
id | operation| keys| col1| col2
---------------------------------
1 | I | 1 | xyz |abc
2 | U | 2 | yxz |cba
3 | D | 3 | NULL|NULL
您可以使用 CASE WHEN
获得您想要的结果。
基本上,查询将如下所示:
SELECT t1.id, t1.operation, t1.keys,
CASE WHEN t1.operation = 'D' THEN NULL ELSE t2.col1 END col1,
CASE WHEN t1.operation = 'D' THEN NULL ELSE t2.col2 END col2
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
AND t1.keys = t2.keys;
我不知道您是真的想进行左联接还是需要内部联接。我不知道您是同时加入 id 和 keys 列还是仅加入其中之一。所以查询将为您的示例产生预期的结果,但是您必须检查这些内容,拜托。
最后一点:您当然甚至可以只删除“CASE WHEN”构造并将 != 'D' 条件放在左连接中。我没有提出这个建议,因为“CASE WHEN”构造简单,允许您在必要时 select col1 和 col2 的不同值,因此它更灵活。
我认为您可以只写一个具有正确条件的 left join
语句,在本例中为 table_1.keys = table_2.keys and table_1.operation != 'D'
。这将加入第二个 table,您将在条件为 false
.
的列中获得 null
select t1.*, t2.col1, t2.col2 from table_1 as t1 left join table_2 as t2 on (t1.keys = t2.keys and t1.operation != 'D')
在 DBfiddle
查看演示
我正在尝试为以下 table 编写一个 sql 连接查询。
我正在尝试按预期获得 table。
唯一的连接条件是,如果在table 1中,操作的值为'D'即删除,那么table 2中的行对应的值为null .
table根据密钥加入。
数据库:POSTGRES
Table 1
id | operation| keys|
-----------------------
1 | I | 1 |
2 | U | 2 |
3 | D | 3 |
Table 2
id |keys| col1| col2
-----------------------
1 | 1 | xyz | abc
2 | 2 | yxz | cba
3 | 3 | zxy | bac
预期输出
id | operation| keys| col1| col2
---------------------------------
1 | I | 1 | xyz |abc
2 | U | 2 | yxz |cba
3 | D | 3 | NULL|NULL
您可以使用 CASE WHEN
获得您想要的结果。
基本上,查询将如下所示:
SELECT t1.id, t1.operation, t1.keys,
CASE WHEN t1.operation = 'D' THEN NULL ELSE t2.col1 END col1,
CASE WHEN t1.operation = 'D' THEN NULL ELSE t2.col2 END col2
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
AND t1.keys = t2.keys;
我不知道您是真的想进行左联接还是需要内部联接。我不知道您是同时加入 id 和 keys 列还是仅加入其中之一。所以查询将为您的示例产生预期的结果,但是您必须检查这些内容,拜托。 最后一点:您当然甚至可以只删除“CASE WHEN”构造并将 != 'D' 条件放在左连接中。我没有提出这个建议,因为“CASE WHEN”构造简单,允许您在必要时 select col1 和 col2 的不同值,因此它更灵活。
我认为您可以只写一个具有正确条件的 left join
语句,在本例中为 table_1.keys = table_2.keys and table_1.operation != 'D'
。这将加入第二个 table,您将在条件为 false
.
null
select t1.*, t2.col1, t2.col2 from table_1 as t1 left join table_2 as t2 on (t1.keys = t2.keys and t1.operation != 'D')
在 DBfiddle
查看演示