我有两个表,表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。
帮助?
答案 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;