[sql] Oracle SQL : 다른 테이블의 데이터로 테이블 업데이트

1 번 테이블:

id    name    desc
-----------------------
1     a       abc
2     b       def
3     c       adf

표 2 :

id    name    desc
-----------------------
1     x       123
2     y       345

오라클 SQL에서 어떻게 실행합니까 SQL 업데이트 표 2의와 표 1을 업데이트 할 수 있습니다 쿼리 namedesc같은를 사용하여 id? 그래서 내가 얻을 최종 결과는

1 번 테이블:

id    name    desc
-----------------------
1     x       123
2     y       345
3     c       adf

하나의 테이블을 다른 테이블의 데이터로 업데이트 하지만 특히 Oracle SQL에 대한 질문에서 문제가 발생 합니다.



답변

이를 상관 업데이트라고합니다

UPDATE table1 t1
   SET (name, desc) = (SELECT t2.name, t2.desc
                         FROM table2 t2
                        WHERE t1.id = t2.id)
 WHERE EXISTS (
    SELECT 1
      FROM table2 t2
     WHERE t1.id = t2.id )

조인 결과 키 보존보기가 있다고 가정하면

UPDATE (SELECT t1.id,
               t1.name name1,
               t1.desc desc1,
               t2.name name2,
               t2.desc desc2
          FROM table1 t1,
               table2 t2
         WHERE t1.id = t2.id)
   SET name1 = name2,
       desc1 = desc2


답변

이 시도:

MERGE INTO table1 t1
USING
(
-- For more complicated queries you can use WITH clause here
SELECT * FROM table2
)t2
ON(t1.id = t2.id)
WHEN MATCHED THEN UPDATE SET
t1.name = t2.name,
t1.desc = t2.desc;


답변

시험

UPDATE Table1 T1 SET
T1.name = (SELECT T2.name FROM Table2 T2 WHERE T2.id = T1.id),
T1.desc = (SELECT T2.desc FROM Table2 T2 WHERE T2.id = T1.id)
WHERE T1.id IN (SELECT T2.id FROM Table2 T2 WHERE T2.id = T1.id);


답변

Update table set column = (select...)

set은 1 값만 필요하기 때문에 나를 위해 일한 적이 없습니다-SQL 오류 : ORA-01427 : 단일 행 하위 쿼리가 둘 이상의 행을 반환합니다.

해결책은 다음과 같습니다.

BEGIN
For i in (select id, name, desc from table1)
LOOP
Update table2 set name = i.name, desc = i.desc where id = i.id;
END LOOP;
END;

그것이 SQLDeveloper 워크 시트에서 정확하게 실행하는 방법입니다. 그들은 느리다고 말하지만 그것은이 경우에 나를 위해 일한 유일한 솔루션입니다.


답변

다음은 조인을 위해 여러 키를 허용하는 ‘in’절을 사용하는 것이 더 나은 답변 인 것 같습니다 .

update fp_active set STATE='E',
   LAST_DATE_MAJ = sysdate where (client,code) in (select (client,code) from fp_detail
  where valid = 1) ...

쇠고기는 ‘in’이전의 where 절에서 괄호 안의 키로 사용하려는 열을 가지며 괄호 안에 동일한 열 이름을 가진 select 문이 있습니다. where ( column1, column2 ) in ( “set I want”테이블에서 select ( column1, column2 ) );


답변

테이블 t1과 백업 t2에 많은 열이있는 경우 여기에 간단한 방법이 있습니다.

또한 관련 문제는 일부 열만 수정되었고 많은 행에 이러한 열을 편집하지 않았기 때문에 기본적으로 전체 테이블의 백업에서 열의 하위 집합을 복원하려고했습니다. 모든 행을 복원하려면 where 절을 건너 뛰십시오.

물론 가장 간단한 방법은 선택하여 삭제하고 삽입하는 것이지만 필자의 경우 업데이트 만 가능한 솔루션이 필요했습니다.

트릭은 중복 열 이름을 가진 테이블 쌍에서 *를 선택하면 두 번째 테이블 이름이 _1이라는 것입니다. 그래서 내가 생각해 낸 것은 다음과 같습니다.

  update (
    select * from t1 join t2 on t2.id = t1.id
    where id in (
      select id from (
        select id, col1, col2, ... from t2
        minus select id, col1, col2, ... from t1
      )
    )
  ) set col1=col1_1, col2=col2_1, ...


답변

BEGIN
For i in (select id, name, desc from table2)
LOOP
Update table1 set name = i.name, desc = i.desc where id = i.id and (name is null or desc is null);
END LOOP;
END;