Sql 基于另一个表中的多行更新表中的行

Sql 基于另一个表中的多行更新表中的行,sql,sql-update,Sql,Sql Update,我有两张表:表1和表2: 表1包含列id和整数 表2包含列id和布尔值 表2可以有多个具有相同id的行 我想更新表1的整数列,方法是查看表2中具有相同id的所有行,并查看是否有任何布尔值为真。如果是,我希望table1.integer为1,否则我希望它为0 我试过这样的方法: UPDATE table1, ( SELECT table2.id, Sum(table2.boolean) > 0 ) AS 'condition' from table2 WHERE

我有两张表:表1表2

  • 表1包含列id和整数

  • 表2包含列id和布尔值

  • 表2可以有多个具有相同id的行

我想更新表1的整数列,方法是查看表2中具有相同id的所有行,并查看是否有任何布尔值为真。如果是,我希望table1.integer为1,否则我希望它为0

我试过这样的方法:

UPDATE table1, 
(
   SELECT table2.id, Sum(table2.boolean) > 0
) AS 'condition' 
from     table2 
WHERE    1 
GROUP BY table2.id) table3 
SET table1.integer =IF(table3.condition, 1, 0) where table1.id = table3.id
UPDATE table1 t1 INNER JOIN (
  SELECT id, MAX(boolean) maxboolean
  FROM table2
  GROUP BY id
) t2 ON t2.id = t1.id
SET t1.integer = t2.maxboolean

这似乎很有效,但我想问,是否有更好/更干净/更简洁的方法根据多行表2更新表1的行

我建议
存在

UPDATE table1 t1
    SET t1.integer = (EXISTS (SELECT 1
                              FROM table2 t2
                              WHERE t2.id = t.id AND
                                    t2.boolean
                             )
                     );

这可以利用
表2(id,布尔值)
上的索引。有了这样一个索引,它应该比使用
JOIN
AGGREGATION
的方法要快。查询的语法类似于MySql,因此您可以这样进行连接:

UPDATE table1, 
(
   SELECT table2.id, Sum(table2.boolean) > 0
) AS 'condition' 
from     table2 
WHERE    1 
GROUP BY table2.id) table3 
SET table1.integer =IF(table3.condition, 1, 0) where table1.id = table3.id
UPDATE table1 t1 INNER JOIN (
  SELECT id, MAX(boolean) maxboolean
  FROM table2
  GROUP BY id
) t2 ON t2.id = t1.id
SET t1.integer = t2.maxboolean
如果
table1
中有
id
s,而
table2
中没有相应的
id
,并且希望将
integer
列更新为
0
,则使用
LEFT
联接:

UPDATE table1 t1 LEFT JOIN (
  SELECT id, MAX(boolean) maxboolean
  FROM table2
  GROUP BY id
) t2 ON t2.id = t1.id
SET t1.integer = COALESCE(t2.maxboolean, 0)

首先找出您正在使用的RDBMS。然后看:您真正使用的是什么RDBMS,在这里标记2(我已经删除了它们)。上面的内容看起来像是您试图同时更新两个表的值(一个通过子查询);DDL操作一次只能影响一个对象,不能影响多个对象,并且不能引用子查询(尽管可以创建可更新的CTE)。