奇怪的SQL UPDATE查询

时间:2013-12-23 23:28:19

标签: sql postgresql sqlalchemy

我有一个查询,我不确定如何写。我有两个具有相同结构的表:

Table1 (id, value1, value2, value_of_interest)

Table2 (id, value1, value2, value_of_interest)

我想找到Table2value1value2匹配的所有行,其中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查询。

1 个答案:

答案 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无效。

  •   
  • SQL中没有==,只有=
  •   
  • t2.value_of_interest IS DISTINCT FROM '' ..以避免空的UPDATE(全部费用不更改)。
  •   
  • 为了避免重复的多次冗余更新,我将普通表t2a转换为折叠它们的子查询。
  •