2010-03-01 3 views
2

은 다른 테이블의 데이터 행을 사용하여 전체 데이터 행을 업데이트 할 수 있습니까.단일 데이터 행을 테이블에서 다른 테이블로 업데이트

예 :

Table A 

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



Table B 

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

그래서 나는 표 A 표 B의 단일 행의 콘텐츠를 복사하고 기존 값을 재정의합니다. 나는 모든 란을 지명하고 싶지 않다. 테이블 A와 B의 내용은 중복됩니다.

요약한다 : 은 내가 UPDATE 문으로 다음 INSERT 문에 해당합니다 : 심지어는 가능하지 않는 것이 말해,

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

어떤 힌트를 매우 appricated된다. 그래서 같이

+1

어쩌면 당신이 먼저 업데이트 한 다음 선택과 삽입을 사용하려는 행을 삭제할 수 있습니다 ? 물론 이것은 해결 방법이라고 생각합니다. 나는 select 문으로 업데이트를 알지 못한다. –

답변

5

당신이 열 세트를 (당신은 여전히 ​​한 번에 열을 나열 할 수있다) 업데이트 할 수 있습니다

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 
+0

정확히 무엇을 넣었지만, 훨씬 더 깨끗하고 멋지다 : o) –

+0

예, 나는 그것을 할 수있는 또 다른 방법이있을 것이라고 생각했습니다. 그러나 저에게 그렇게는 괜찮습니다. 감사합니다 Ardman 및 감사 Vincent. – road242

+0

table_b의 테이블 구조가 SET 목록과 정확히 같지 않으면 SELECT *를 사용할 수 없습니다. 당신은 아마도 필드를 SELECT에 나열해야 할 것이다. – Leslie

1

:

당신은 오라클 MERGE 문을 사용하려면
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); 
+0

감사합니다. 그러나 각 열의 이름을 지정하고 싶지는 않습니다. 다른 제안? – road242

+1

열이 동일하면 다음과 같이하면됩니다. UPDATE tableA FROM tableB WHERE 등 –

+0

더 이상 upvote 할 수 없습니다 (변경할 값이 너무 오래되었습니다 ...). 그 죄송합니다. upvote ... – road242

1

. 이 명령문을 사용하면 일치 항목이 없으면 삽입하고 이미 존재하는 경우 업데이트합니다.

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); 
+0

유일한 속임수는 당신이하고 싶지 않은 것처럼 들리는 UPDATE 문에 명시 적으로 열을 나열해야한다는 것입니다. –

관련 문제