将表中的单个数据行更新为另一个

时间:2010-03-01 13:28:20

标签: sql oracle oracle10g

如何使用其他表中的数据行更新完整的数据行。

示例:

Table A

ID   |   NAME    |   ...   |
----------------------------
 1   |   Test    |   ...   |
 2   |   Test2   |   ...   |



Table B

ID   |   NAME    |   ...   |
----------------------------
 1   |   Test97  |   ...   |

所以我想将表B的单行内容复制到表A并覆盖现有值。我不想命名所有列。表A和表B的内容是多余的。

总结 我想要一个等效的以下INSERT语句作为UPDATE语句:

INSERT INTO destTable 
VALUES  (SELECT * FROM TABLE2)
FROM srcTable 

任何提示,甚至告诉我它不可能,都非常适合。

3 个答案:

答案 0 :(得分:6)

您可以更新一组列(您仍然需要列出一次列):

SQL> UPDATE table_a
  2     SET (ID, NAME, etc)
  3         = (SELECT * FROM table_b WHERE table_b.id = table_a.id)
  4   WHERE table_a.id IN (SELECT ID FROM table_b);

1 row updated

答案 1 :(得分:1)

像这样:

UPDATE suppliers  
SET supplier_name = ( SELECT customers.name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id) 
WHERE EXISTS
  ( SELECT customers.name
    FROM customers
    WHERE customers.customer_id = suppliers.supplier_id); 

答案 2 :(得分:1)

您想使用Oracle MERGE语句。使用此语句,如果匹配不存在则插入,如果匹配则已存在,则进行更新。

Here是一个有示例的网站。

MERGE INTO bonuses b
USING (
  SELECT employee_id, salary, dept_no
  FROM employee
  WHERE dept_no =20) e
ON (b.employee_id = e.employee_id)
WHEN MATCHED THEN
  UPDATE SET b.bonus = e.salary * 0.1
  DELETE WHERE (e.salary < 40000)
WHEN NOT MATCHED THEN
  INSERT (b.employee_id, b.bonus)
  VALUES (e.employee_id, e.salary * 0.05)
  WHERE (e.salary > 40000);