如何从外部表更新表

时间:2013-04-27 16:23:22

标签: sql oracle

我想根据外部表更新员工表,但是我收到了ORA-01427错误, 单行子查询返回多行

employee(emp_id, emp_name, job_history, city_code)
ext_table(emp_name, job_history, city_name)
city(city_code, city_name)

我的ext_table中的数据如下:

Sandy, waitress, los angeles
Sandy, restaurant manager, los angeles
John, store manager, phoenix

update employee em
set (em.emp_name, em.job_history, em.city_code) = 
    (select t.emp_name, t.job_history, t.city_code
     from (select distinct(emp_name), job_history, c.city_code from 
           ext_table e, city c where e.city_name=c.city_name) t) 
    where em.emp_name=t.emp_name;

我非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

这是MERGE的用途:

merge into employee 
using
(
  select e.emp_name, e.job_history, c.city_code 
  from ext_table e 
    join city c on e.city_name=c.city_name
) t on (t.emp_name = employee.emp_name)
when matched then update
  set job_history = t.job_history, 
      city_code = t.city_code;

请注意,更新emp_name无用,因为这是您用于ext_tableemployee之间加入的列。

以上假设emp_name在ext_table(和员工)中是唯一的。如果不是这种情况,您将需要找到一个唯一标识外部表中员工的“密钥”。

另外:distinct NOT 一个函数。

select distinct (foo), barselect distinct foo, bar完全相同。它始终在所有列上运行。两者之间的差异与select (foo),barselect foo, bar之间的差异相同。

答案 1 :(得分:0)

另一种可能的选择是将外部表转换为常规表并进行更新。要将外部转换为常规表,请使用SQL Developer。步骤:1。使用与外部表相同的结构创建空表。 2.从外部向reg输出数据。表。该过程类似于将数据从文件导出到Excel。

答案 2 :(得分:-2)

您可以通过使用连接更新查询来完成此操作。检查以下代码

  

更新员工SET job_history = B.job_history,city_code =   C.city_code FROM EMPLOYEE作为内部联接ext_table AS B ON   A.emp_name = B.emp_name INNER JOIN city AS C ON B.city_name =   C.city_name