我有一个查询,我不确定如何写。我有两个具有相同结构的表:
Table1 (id, value1, value2, value_of_interest)
Table2 (id, value1, value2, value_of_interest)
我想找到Table2
上value1
和value2
匹配的所有行,其中Table1.value_of_interest
为空,并从Table2
复制这些值。因此,SQL将是:
UPDATE Table1
SET Table1.value_of_interest = Table2.value_of_interest
FROM Table2
WHERE Table1.value_of_interest == ''
AND Table1.value1 == Table2.value1
AND Table1.value2 == Table2.value2
但是,Table2
上的匹配行集也可能没有唯一的value_of_interest
。如果来自Table1.value_of_interest
的匹配行集合具有唯一Table2
,我只想更新value_of_interest
。
例如,假设我们有
Table1(0, 1, 1, '')
Table2(0, 1, 1, 1)
Table2(1, 1, 1, 1)
然后我会用{更新Table1.value_of_interest
但是如果我有:
Table1(0, 1, 1, '')
Table2(0, 1, 1, 1)
Table2(0, 1, 1, 2)
然后我什么都不做。我正在考虑使用GROUP BY
的聚合函数,并测试DISTINCT
值等于1,但我无法弄明白。任何建议将不胜感激。
PS。我正在使用PostgreSQL和SQLAlchemy,但我无法使用ORM执行此操作,因此我尝试进行直接的SQL查询。
答案 0 :(得分:1)
简单的方法是添加NOT EXISTS
半反连接:
UPDATE table1 t1
SET value_of_interest = t2a.value_of_interest
FROM (
SELECT DISTINCT value1, value2, value_of_interest
FROM table2
) t2a
WHERE t1.value_of_interest = ''
AND t2a.value_of_interest IS DISTINCT FROM ''
AND t1.value1 = t2a.value1
AND t1.value2 = t2a.value2
AND NOT EXISTS (
SELECT 1
FROM table2 t2b
WHERE t2b.value1 = t2.value1
AND t2b.value2 = t2.value2
AND t2b.value_of_interest <> t2a.value_of_interest
);
此外:
SET
子句中的目标列没有表格限定条件。
SET Table1.value_of_interest = ...
我引用the manual here:
不要在目标列的规范中包含表名 - 例如,
UPDATE tab SET tab.col = 1
无效。
==
,只有=
。 t2.value_of_interest IS DISTINCT FROM ''
..以避免空的UPDATE(全部费用不更改)。t2a
转换为折叠它们的子查询。