使用相同的用户名更新另一个表中的表值

时间:2010-10-02 12:34:17

标签: sql sqlite

我有两个表,其中一列名为user_name,代表table_atable_b

我想分别从table_bcolumn_b_1column_b2复制到table_b1column_a_1column_a_2,其中user_name是一样的,如何在SQL语句中做到这一点?

4 个答案:

答案 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,您可以将目标表与数据库中的其他表连接起来,以帮助计算需要更新的行以及这些行上的新值