【问题标题】:SQL - Add column data from one table into another while preserving original dataSQL - 将一个表中的列数据添加到另一个表中,同时保留原始数据
【发布时间】:2014-11-06 12:01:35
【问题描述】:

我需要将一个表(table1)中的数据添加到另一个表(table2)中,其中全名列中的数据在两个表中都匹配。下面的代码几乎可以满足我的要求,只是它删除了 table1 标题列中的所有其他数据。

UPDATE table1
SET title = (SELECT title
               FROM table2
             WHERE table2.fullname = table1.fullname)

我的目标是更新 table1 的标题列,使其既包含原来的数据,又包含 table2 的标题列中的数据,而不会在运行 SQL 查询之前删除 table1 的标题列中的数据。

【问题讨论】:

  • 如果table2中有两条或多条记录具有相同的fullname怎么办?
  • 你标记了所有你使用的 dbms,oracle 或 sql server
  • 你的意思是要连接两个字段吗?
  • google“更新加入”为您的 dbms
  • @ekad,这是个好问题。它确实使事情复杂化。有一些方法可以绕过它,其中最简单的方法是在子查询中使用聚合函数,例如 MAX()

标签: sql database oracle


【解决方案1】:

根据您给出的语法,我假设您使用的是 Oracle。问题是,当您使用这种形式的 UPDATE 语句时,您还需要一个 WHERE EXISTS 子句或类似的东西:

UPDATE table1
   SET title = ( SELECT title
                   FROM table2
                  WHERE table2.fullname = table1.fullname )
 WHERE EXISTS ( SELECT 1 FROM table2
                  WHERE table2.fullname = table1.fullname )

否则不匹配的标题将被清空!原因是table2中不存在fullname时子查询的结果为NULL。

如果您正在寻找连接(如上面的@PM 77-1 cmets),那么您需要执行以下操作:

UPDATE table1
   SET title = title || ',' || ( SELECT title
                                   FROM table2
                                  WHERE table2.fullname = table1.fullname )
 WHERE EXISTS ( SELECT 1 FROM table2
                  WHERE table2.fullname = table1.fullname )

希望这会有所帮助。

【讨论】:

  • 谢谢。您的第一个建议正是我所需要的。
【解决方案2】:

在 Oracle 中,您可以使用合并:

MERGE INTO table1 t1
USING (SELECT fullname, title
       FROM   table2) t2
ON t1.fullname = t2.fullname
WHEN MATCHED THEN
  UPDATE SET t1.title = t2.title;

这只会更新在fullname 上找到匹配项的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 2013-07-17
    • 2015-06-11
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多