>

이 작업은 SQL Server에서 잘 수행 할 수 있습니다 (UPDATE 문에서 FROM 절을 사용할 수 있음). 그러나 저는 Oracle SQL을 처음 접했습니다. 시나리오는 이와 같이 간단합니다. 2 개의 테이블이 있습니다 (같은 행 수를 가짐). 이제 row_number 를 일치 시켜이 테이블의 한 열을 다른 테이블의 한 열로 업데이트해야합니다.  각 테이블의.

Oracle UPDATE를 참조했는데 가장 유망한 접근 방식입니다.

update 
(select * from 
 (select A1, 
         row_number() over (order by A1) as rn from A) d 
 join 
 (select B1, 
         row_number() over (order by B1) as rn from B) v on d.rn = v.rn)
set A1 = B1;

그러나 다음과 같은 오류가 발생했습니다 :

cannot modify a column which maps to a non key-preserved table

이와 같은 UPDATE와 관련된 몇 가지 예가 있지만 일치하는 조건에는 기본 테이블의 기존 열 (업데이트 해야하는 테이블)이 포함되어 있지 않기 때문에 시나리오와 다릅니다.

  • 답변 # 1

    테이블은 행을 식별하기 위해기본 키또는고유 키를 가져야합니다. 두 테이블이 관련된 것으로 간주되는 경우 서로 연결하는 외래 키 또는 레코드를 고유하게 식별하는 공통 열 세트가 있어야합니다. 그렇지 않은 경우 기본 RDBMS 원칙을 위반합니다. 와이즈 비즈  테이블에 존재하는 물리적 키가 아닌 숫자를 생성하는 함수입니다. 효율적인 데이터 추출 방법과 간단한 쿼리를 사용하도록 디자인을 변경해야합니다.

    해결 방법으로 row_number() 를 사용할 수 있습니다   MERGE 를 사용한 진술 . 그러나 행 수가 일치하지 않거나 내가 생각할 수없는 다른 시나리오가 있으면 예상대로 작동하지 않을 수 있습니다.

    ROWID
    
    

    데모

    이것이 간단한 업데이트가 아닌 이유는 테이블의 행에 기본 순서가 없기 때문입니다. 그러므로 우리에게 원하는 순서를 주려면 기본 키와 같은 키가 필수적입니다.

  • 답변 # 2

    구문의 순서대로 원하는 결과를 얻을 수 있지만 이에 대한 직접적인 해결책은 없습니다 :

    솔루션 1 : 테이블 변경

    MERGE INTO a 
    using (SELECT a.a1, 
                  b.b1, 
                  a.rid 
           FROM   (SELECT a.*, 
                          row_number() 
                            OVER ( 
                              ORDER BY a1 ) AS rn, 
                          a.rowid           AS rid 
                   FROM   a) a 
                  JOIN (SELECT b.*, 
                               row_number() 
                                 OVER ( 
                                   ORDER BY b1 ) AS rn 
                        FROM   b) b 
                    ON ( a.rn = b.rn )) s 
    ON ( a.rowid = s.rid ) 
    WHEN matched THEN 
      UPDATE SET a.a1 = s.b1;
    
    


    솔루션 2 : 세 번째 테이블 사용

    --alter table to add a column for sequencing
    alter table A
    add(rownumber number);
    alter table B
    add(rownumber number);
    --add sequencing
    update A
    set rownumber = rownum;
    update B
    set rownumber = rownum;
    --update Data
    update A
    set A1 = (select B1 from B where A.rownumber = B.rownumber)
    --undo DDL changes
    alter table A
    drop column rownumber;
    alter table B
    drop column rownumber;
    
    

    Oracle CREATE global TEMPORARY TABLE ab ( a1 VARCHAR(10), b1 VARCHAR(10) ) ON COMMIT DELETE ROWS; INSERT INTO ab (SELECT a1, b1 FROM (SELECT a1, Row_number() over ( ORDER BY a1) AS rna FROM a) xa join (SELECT b1, Row_number() over ( ORDER BY b1) AS rnb FROM b) xb ON xa.rna = xb.rnb); UPDATE a SET a1 = (SELECT b1 FROM ab WHERE ab.a1 = a.a1); DROP TABLE ab; 사용  병합이 Merge 에 사용 된 것과 동일한 열 업데이트를 지원하지 않으므로 row_number 열이 업데이트 할 열과 다른 경우 가능한 해결책이었습니다.  절.

    ON

관련 자료

  • 이전 python - Anaconda에서 pip없이 fix_yahoo_finance 설치
  • 다음 해시 C #에서 텍스트를 처리하고 텍스트를 가져 오는 방법