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

Bin*_*hen 65 sql sqlite

我有两个表,同一列名为user_name,表示table_a,table_b.

我想,从table_b,column_b_1,column_b2,分别复制到table_b1,column_a_1,column_a_2,其中user_name是相同的,如何在sql语句中做到这一点?

mar*_*ton 121

只要你有适当的索引,这应该是正常的:

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
    )
Run Code Online (Sandbox Code Playgroud)

sqlite3中的UPDATE 不支持FROM子句,这使得它比其他RDBMS更多的工作.

如果性能不令人满意,另一个选项可能是使用select和table_a连接到table_a为临时表建立新行.然后从table_a中删除数据并从临时值中重新填充.

  • 我不得不从set参数的左侧排除table_a部分,以使其工作.使用上面的答案,它看起来像`column_a_1 =(SELECT table_b.column_b_1 FROM table_b WHERE table_b.user_name = table_a.user_name)` (4认同)

Ale*_*der 15

从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
   )
Run Code Online (Sandbox Code Playgroud)

这不仅更短,而且更快


Luk*_*zda 8

可以使用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;
Run Code Online (Sandbox Code Playgroud)

或者:

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;
Run Code Online (Sandbox Code Playgroud)

更新自 - SQLite 版本 3.33.0

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

  • 第二个变体比第一个变体快得多。谢谢你! (2认同)