我有两个表,一个名为同一列中user_name
,他说table_a
,table_b
。
我想,从复制table_b
,column_b_1
,column_b2
,以table_b1
,column_a_1
,column_a_2
,分别,这里的user_name
是一样的,如何做到这一点的SQL语句?
Answers:
只要您有合适的索引,它就可以正常工作:
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
)
sqlite3中的UPDATE不支持FROM子句,这使它比其他RDBMS的工作量更多。
如果性能不令人满意,则另一个选择可能是使用select为table_a建立新行,并与table_a联接到临时表中。然后从table_a中删除数据,并从临时表中重新填充。
从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
)
不仅更短而且更快
有一个更好的解决方案来从另一个表更新一个表:
;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)
;
user_name
在原始问题中),它将无法正常工作。而是,这会将更新表中的所有对应值设置为源表中仅一个记录的值。尝试列出公共列并添加WHERE
条件,但是没有用。
(SELECT song_id FROM a WHERE guid=record_performance.guid)
可以使用以下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的想法是对SQL的扩展,它允许UPDATE语句由数据库中的其他表驱动。“目标”表是正在更新的特定表。使用UPDATE-FROM,您可以将目标表与数据库中的其他表连接起来,以帮助计算需要更新的行以及这些行上的新值
column_a_1 = (SELECT table_b.column_b_1 FROM table_b WHERE table_b.user_name = table_a.user_name )