我有两个表,其中一列名为user_name
,代表table_a
,table_b
。
我想分别从table_b
,column_b_1
,column_b2
复制到table_b1
,column_a_1
,column_a_2
,其中user_name
是一样的,如何在SQL语句中做到这一点?
答案 0 :(得分:116)
只要您有适当的索引,这应该可以正常工作:
UPDATE table_a
SET
column_a_1 = (SELECT table_b.column_b_1
FROM table_b
WHERE table_b.user_name = table_a.user_name )
, column_a_2 = (SELECT table_b.column_b_2
FROM table_b
WHERE table_b.user_name = table_a.user_name )
WHERE
EXISTS (
SELECT *
FROM table_b
WHERE table_b.user_name = table_a.user_name
)
3 {}中的UPDATE不支持FROM子句,这使得它比其他RDBMS更多的工作。
如果性能不令人满意,另一个选择可能是使用select和table_a连接到table_a为临时表建立新行。然后从table_a中删除数据并从临时文件中重新填充。
答案 1 :(得分:11)
从sqlite 3.15版开始,UPDATE的语法允许列名列表 在SET部分中,查询可以写为
UPDATE table_a
SET
(column_a_1, column_a_2) = (SELECT table_b.column_b_1, table_b.column_b_2
FROM table_b
WHERE table_b.user_name = table_a.user_name )
WHERE
EXISTS (
SELECT *
FROM table_b
WHERE table_b.user_name = table_a.user_name
)
不仅更短,而且更快
答案 2 :(得分:3)
从另一个表更新一个表有一个更好的解决方案:
;WITH a AS
(
SELECT
song_id,
artist_id
FROM
online_performance
)
UPDATE record_performance
SET
op_song_id=(SELECT song_id FROM a),
op_artist_id=(SELECT artist_id FROM a)
;
答案 3 :(得分:2)
可以使用UPDATE FROM
语法实现:
UPDATE table_a
SET column_a_1 = table_b.column_b_1
,column_a_2 = table_b.column_b_2
FROM table_b
WHERE table_b.user_name = table_a.user_name;
或者:
UPDATE table_a
SET (column_a_1, column_a_2) = (table_b.column_b_1, table_b.column_b_2)
FROM table_b
WHERE table_b.user_name = table_a.user_name;
UPDATE FROM - SQLite version 3.33.0
UPDATE-FROM的想法是对SQL的扩展,它允许UPDATE语句由数据库中的其他表驱动。 “目标”表是正在更新的特定表。使用UPDATE-FROM,您可以将目标表与数据库中的其他表连接起来,以帮助计算需要更新的行以及这些行上的新值