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

查看演示