복붙노트

[SQL] 오라클 SQL은 : 다른 테이블의 데이터로 테이블을 업데이트

SQL

오라클 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에서 어떻게 표 2의 이름과 내림차순이 동일한 ID를 사용하여 표 1을 업데이트 할 수있는 SQL 업데이트 쿼리를 실행합니까? 내가 얻을 것 최종 결과는 그래서

1 번 테이블:

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

질문하지만, 특히 오라클 SQL에 대한 다른 데이터로 업데이트 한 테이블에서 가져옵니다.

해결법

  1. ==============================

    1.이것은 상관 갱신이라고합니다

    이것은 상관 갱신이라고합니다

    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
    
  2. ==============================

    2.이 시도:

    이 시도:

    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;
    
  3. ==============================

    3.시험

    시험

    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);
    
  4. ==============================

    4.

    Update table set column = (select...)
    

    ORA-01427 : 단일 행 부질의 반환 둘 이상의 행 SQL 오류 - 세트는 1 개 값을 기대하고 있기 때문에 나를 위해 일하지 않았다.

    여기에 솔루션입니다 :

    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 워크 시트에서 실행하는 방법을 정확히. 그들은 느린하지만이 경우에 나를 위해 일한 유일한 솔루션입니다 말한다.

  5. ==============================

    5.여기 가입에 대한 여러 키를 허용 조항 '에'와 더 좋은 해답이 될 것 같다 :

    여기 가입에 대한 여러 키를 허용 조항 '에'와 더 좋은 해답이 될 것 같다 :

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

    쇠고기는 '에'전에 WHERE 절에 괄호 키로 사용하고 괄호 안에 동일한 열 이름을 가진 select 문을하려는 열을 가지는입니다. 어디에서 (1 열, 2 열) (선택 (컬럼 1, 테이블 2 열) 여기서 "설정 내가 원하는");

  6. ==============================

    6.당신의 테이블 t1과의 백업 T2는 많은 열이있는 경우, 여기에 그것을 할 수있는 컴팩트 한 방법이다.

    당신의 테이블 t1과의 백업 T2는 많은 열이있는 경우, 여기에 그것을 할 수있는 컴팩트 한 방법이다.

    기본적으로 전체 테이블의 백업에서 컬럼의 서브 세트를 복원 - 또한, 내 관련 문제는 일부 열이 수정 된 나는 그 혼자두고 싶어 너무 많은 행이이 컬럼에 더 편집이 없다고했다. 당신은 단지 모든 행을 복원하려면, where 절을 건너 뜁니다.

    물론 간단한 방법은 삭제하고 선택으로 삽입하는 것입니다,하지만 내 경우에는 그냥 업데이트 솔루션이 필요했습니다.

    트릭은 당신이 중복 된 열 이름과 테이블의 한 쌍에서 선택 *를 수행 할 때, 제 2 하나 _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, ...
    
  7. ==============================

    7.

    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;
    
  8. from https://stackoverflow.com/questions/7030699/oracle-sql-update-a-table-with-data-from-another-table by cc-by-sa and MIT license