2013-01-11 74 views
-1

我有两个表,我需要更新第二个表的值来自第一个表的基于一个公共列。更新声明与两个表-Oracle

我用下面的语句

UPDATE emp 
    2  SET ename = (SELECT dname 
    3     FROM dept 
    4     WHERE emp.deptno = dept.deptno) 
    5  WHERE EXISTS 
    6  (SELECT dname 
    7     FROM dept 
    8     WHERE emp.deptno = dept.deptno); 

但我得到

ORA-01427 - Single row subquery returns more than one row. 

你能普莱舍帮助我的错误?

+0

你为什么更新ename with dname? – bonCodigo

+0

除非您有两个相同编号的部门,否则不应该发生这种情况。是不是deptno部门的主要关键? – Thilo

+0

这只是一个example.The真实查询是 更新bons_nma_in一套a.bons_incident_number = 其中存在(来自bons_outage b其中选择b.incident_number(从bons_outage b其中a.NMA_TICKET_NUMBER = b.NMA_TICKET_NUMBER选择b.incident_number) a.NMA_TICKET_NUMBER = b.NMA_TICKET_NUMBER) – user1969171

回答

0
SELECT dname 
FROM dept 
WHERE emp.deptno = dept.deptno 

查询必须返回单个记录。

检查与

SELECT count(*), dname 
FROM dept 
group by dname 
having count(*) > 1 
order by 1 desc 

或使用

SELECT dname 
FROM dept 
WHERE emp.deptno = dept.deptno 
and rownum = 1 
+1

最好不要使用rownum技巧。如果确实有一个部门名称太多,那么错误优于不一致的数据。 – Thilo

+0

问题是查询返回多行,我需要更新多行 – user1969171

0

您需要检查,如果第一个子查询只返回值为1 BCZ如果子查询返回要更新与1周的ename更多的则1排2行的值,这就是为什么我猜你有这个错误

0

你的子查询dept表可能不会返回一行。添加minmax操作,从dept获得一行,从emp开始。每个设置值都必须是非歧义的。

UPDATE emp 
    SET ename = (SELECT min dname 
        FROM dept 
        WHERE emp.deptno = dept.deptno) 
    WHERE EXISTS 
     (SELECT dname 
        FROM dept 
        WHERE emp.deptno = dept.deptno); 

备注1:在默认情况下SCOTT模式deptno是主键,所以会遇到没有错误。
备注2:你的问题不应该放在serverfault.com

+0

是的,它返回多行。有没有解决方案来更新多行? – user1969171

+0

如果查询返回多行,Oracle应该做什么?你想要哪个部门名?你可以将'ename'设置为其中的一个。 – Thilo