이 작업은 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
- 답변 # 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
관련 자료
- oracle - 한 테이블의 데이터를 사용하여 업데이트 트리거를 만들어 다른 테이블을 업데이트 할 수 있습니까?
- sql - 조인을 사용하여 다른 열의 데이터로 테이블의 열 업데이트
- SQL Server는 JSON을 구문 분석하여 다른 테이블을 업데이트합니다
- php - 다른 열의 다른 테이블 데이터와 관련하여 테이블 데이터 (td)를 어떻게 업데이트 할 수 있습니까?
- sql - 여러 열의 최소 날짜 시간으로 임시 테이블 업데이트
- sql - 고유 ID가있는 수백 개의 레코드가있는 기존 테이블을 어떻게 업데이트합니까?
- sql - 해당 열에 다른 값이없는 경우에만 테이블 열 업데이트
- r - 다른 변수에 조건이 지정된 테이블 함수를 사용하는 방법은 무엇입니까?
- javascript - 다른 개체에서 개체의 특정 속성을 업데이트하는 방법은 무엇입니까?
- reactjs - Typescript를 사용하여 반응 앱에서 클릭시 다른 테이블 행을 추가하는 방법
- sqlite - 하나의 SQL 테이블에서 모든 것을 조인하고 다른 테이블에서 처음 발생하여 첫 번째 테이블에서 모두 유지하는 방법
- clickhouse - 다른 테이블을 기반으로하는 시계열 쿼리
- sql - 다른 테이블의 행을 어떻게 재정의 할 수 있습니까?
- text processing - 한 테이블에서 값을 찾고 join/awk를 사용하여 다른 테이블에 출력
- sql - 특정 패턴으로 한 테이블의 행을 다른 테이블의 열에 삽입
- MYSQL은 ID를 다른 테이블의 이름으로 바꿉니다
- sql - 동일한 테이블 내에서 특정 열을 업데이트하고 제한을 추가합니다PostgreSQL
- MS Access VBA, 하나의 테이블을 업데이트하고 다른 테이블에서 삭제 시도
- excel - 다른 목록을 사용하여 한 목록에서 일치하는 요소를 제거하는 방법은 무엇입니까? 파이썬
- SQL Server 자동 업데이트 테이블
- sql : 오라클에서 오래된 데이터 업데이트
- 주당 총 근무 시간 계산 방법 [SQL]
- sql : sysdate의 반환 유형이 DATE인 이유는 무엇입니까?
- 환율을 가져오는 SQL 쿼리
- Oracle SQL 쿼리가 실행되지 않음
- SQL의 여러 테이블에서 불일치 데이터를 쿼리하는 방법
- sql : Oracle에서 구체화된 뷰를 한 DB 서비스 이름에서 다른 이름으로 복사/이동하는 방법이 있습니까?
- sql : 날짜 함수 Trunc(SysDate)
- SQLPlus 프로그램에서 Oracle 동시 요청 출력/로그에 쓰기
- sql : Oracle의 계층적 WITH 쿼리에서 현재 행과 하위 행의 합계 계산
테이블은 행을 식별하기 위해기본 키또는고유 키를 가져야합니다. 두 테이블이 관련된 것으로 간주되는 경우 서로 연결하는 외래 키 또는 레코드를 고유하게 식별하는 공통 열 세트가 있어야합니다. 그렇지 않은 경우 기본 RDBMS 원칙을 위반합니다. 와이즈 비즈 테이블에 존재하는 물리적 키가 아닌 숫자를 생성하는 함수입니다. 효율적인 데이터 추출 방법과 간단한 쿼리를 사용하도록 디자인을 변경해야합니다.
해결 방법으로
row_number()
를 사용할 수 있습니다MERGE
를 사용한 진술 . 그러나 행 수가 일치하지 않거나 내가 생각할 수없는 다른 시나리오가 있으면 예상대로 작동하지 않을 수 있습니다.데모
이것이 간단한 업데이트가 아닌 이유는 테이블의 행에 기본 순서가 없기 때문입니다. 그러므로 우리에게 원하는 순서를 주려면 기본 키와 같은 키가 필수적입니다.