如何将数据从表A中的一列复制到Oracle中的表B.

时间:2018-01-16 21:45:35

标签: sql oracle

我有两个表,表A和表B.表A列出了项目名称及其唯一ID。表B列出了相同的项目名称,但没有ID。我想根据项目名称将ID复制到表B.我已经在表B中的单独命令中创建了该列,但是我无法弄清楚如何复制它。我使用了以下代码:

Update B
Set B.ID = 
(Select A.ID From A Where A.Name = B.Name)
Where Exists (Select A.ID From A Where A.Name = B.Name);

但我一直在犯错误。特别: SQL错误:ORA-01427:单行子查询返回多行 01427. 00000 - "单行子查询返回多行"

ID是字母数字。名称和ID不一定是唯一的,因此如果名称值重复,我希望它仍然分配正确的ID。

帮助?

2 个答案:

答案 0 :(得分:1)

您必须定义“正确”ID是什么。您可以使用rownum或聚合函数轻松获取一个 ID:

Update B
    Set B.ID = (Select A.ID From A Where A.Name = B.Name and rownum = 1)
    Where Exists (Select A.ID From A Where A.Name = B.Name);

或:

Update B
    Set B.ID = (Select max(A.ID) From A Where A.Name = B.Name)
    Where Exists (Select A.ID From A Where A.Name = B.Name);

其中一个应该解决您的问题。

虽然我不推荐它,但您也可以获得所有匹配ID的列表:

Update B
    Set B.ID = (Select listagg(A.ID, ',') within group (order by A.ID) From A Where A.Name = B.Name)
    Where Exists (Select A.ID From A Where A.Name = B.Name);

但我确实憎恶将列表存储为逗号分隔的字符串。

答案 1 :(得分:0)

另一种方法是使用for循环,见下面的代码。

BEGIN
    FOR tab_a IN (SELECT ID, NAME
                    FROM table_a)
    LOOP
         UPDATE table_b
            SET id = tab_a.id
          WHERE name = tab_a.name;
         --comment dbms_output if a lot of records involved or you can increase the output size
         DBMS_OUTPUT.PUT_LINE(tab_a.name||':::'||SQL%ROWCOUNT);
    END LOOP;
END;
/

COMMIT;