Oracle:使用另一个表中的值更新列

时间:2013-07-19 14:24:41

标签: sql oracle sql-update

我在现有表中添加了一个新列。我想用一个从另一个表中检索的值填充它。

表:EXPORT

Name | email | employeeid | userid

表:USER

id |  name  | email  | idnumber

新列为EXPORT.userid,我希望等于USER.id。请注意,ididnumber 不一样 - idnumber存储employeeid,而id是自动增量PK 。 USER.idnumber等于EXPORT.employeeid

我希望在EXPORT.userid时使用USER.id填充export.employeeid = user.idnumber

如何使用与Oracle兼容的SQL代码?

我尝试了以下操作,但它给我一个错误。

UPDATE EXPORT  
   SET userid = ( SELECT id 
                FROM USER 
               WHERE USER.idnumber = EXPORT.employeeid 
                 and USER.EMAIL = EXPORT.email) 
 WHERE EXISTS( SELECT 1
             FROM USER
            WHERE USER.idnumber = EXPORT.employeeid 
              and USER.EMAIL = EXPORT.email) 

但是我收到了这个错误

[Error] Execution (2: 19): ORA-01427: single-row subquery returns more than one row

2 个答案:

答案 0 :(得分:1)

对于给定的电子邮件和idnumber,该子查询可能会返回多行:

SELECT id 
                FROM USER 
               WHERE USER.idnumber = EXPORT.employeeid 
                 and USER.EMAIL = EXPORT.email

尝试使用DISTINCT排除重复项:

SELECT DISTINCT id 
                FROM USER 
               WHERE USER.idnumber = EXPORT.employeeid 
                 and USER.EMAIL = EXPORT.email

或者在您的问题中添加一些示例数据。表USER和EXPORT的唯一键是什么?

答案 1 :(得分:0)

尝试运行以下查询

SELECT * FROM (
    SELECT USER.idnumber, USER.EMAIL, COUNT(*) AS cnt
    FROM USER
    GROUP BY USER.idnumber, USER.EMAIL
) c
WHERE c.cnt > 1

如果您看到任何行,那么这就是您的问题。

例如,如果您有一个类似于

的USER表
id |  name    |      email         | idnumber
1  | icefresh | icefresh@what.ever | 100
2  | icefresh | icefresh@what.ever | 100

然后你的查询

SELECT id 
FROM USER 
WHERE USER.idnumber = EXPORT.employeeid 
    and USER.EMAIL = EXPORT.email

将返回1和2.为了使其起作用,它只能返回1个值。