Sql 基于另一个表中的多行更新表中的行
我有两张表:表1和表2: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包含列id和整数
- 表2包含列id和布尔值
- 表2可以有多个具有相同id的行
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)。