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


75

我有两个表,一个名为同一列中user_name,他说table_atable_b

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

Answers:


135

只要您有合适的索引,它就可以正常工作:

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中删除数据,并从临时表中重新填充。


4
我必须从set参数的左侧排除table_a部分,以使其正常工作。使用上面的答案,它看起来像是column_a_1 = (SELECT table_b.column_b_1 FROM table_b WHERE table_b.user_name = table_a.user_name )
Jim Geurts 2012年

该答案有助于更详细地了解如何复制发布在stackoverflow.com/questions/17267417/…上的
zerocog

在此执行联接多少次?在table_a中仅3次,还是每行3次?(我的SQL生锈了)
toto_tico

1
回答我自己的问题,它是每行3次,请参阅@Alejadro答案...
toto_tico

嗨,我是SQL的新手。为什么需要这么多WHERE原因?
Llamageddon '19

23

从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

有一个更好的解决方案来从另一个表更新一个表:

;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)

;

1
由于上面正在查找特定的行(record_id = 2347),因此必须将上述代码写1000次才能更新1000行吗?
Rasmus Larsen

1
这似乎很有希望,但是当您需要将两个表连接到一个共同的列上时(例如user_name在原始问题中),它将无法正常工作。而是,这会将更新表中的所有对应值设置为源表中仅一个记录的值。尝试列出公共列并添加WHERE条件,但是没有用。
aexl

1
更新实际上,我的尝试是正确的。我可能在查询中多了一行,但由于某种原因它没有提示错误,这使我感到困惑。解决的方法的确是将必需的列添加到第一选择中,然后使所有其他选择都引用该列,例如(SELECT song_id FROM a WHERE guid=record_performance.guid)
aexl

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版本3.33.0

UPDATE-FROM的想法是对SQL的扩展,它允许UPDATE语句由数据库中的其他表驱动。“目标”表是正在更新的特定表。使用UPDATE-FROM,您可以将目标表与数据库中的其他表连接起来,以帮助计算需要更新的行以及这些行上的新值

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.