두 테이블 간 하위 쿼리를 기반으로 한 Oracle SQL 업데이트
저는 현재 쿼리 가능한 테이블을 항상 최신 상태로 유지하기 위해 업데이트 문을 작성하고 있습니다.스키마는 두 테이블 간에 동일하며 내용은 중요하지 않습니다.
STAGING
ID
NAME
COUNT
PRODUCTION
ID
NAME
COUNT
내 업데이트 설명은 다음과 같습니다.
update PRODUCTION
set name = (select stage.name from staging stage where stage.name=name and rownum <2),
count = (select stage.countfrom staging stage where stage.count=count and rownum <2);
두 가지 주의할 점은 1) 내 업데이트 끝에 where 절이 없다는 것(이것이 문제일 수 있음)과 2) 업데이트된 이후의 모든 레코드가 동일한 값을 가지고 있다는 것입니다.제가 의미하는 바는 다음과 같습니다.
BEFORE UPDATE:
1,"JOHN", 12;
2,"STEVE",15;
3,"BETTY",2;
AFTER UPDATE
1,"JOHN", 12;
2,"JOHN",12;
3,"JOHN",12;
문제는 테이블이 올바른 SQL 업데이트로 스테이징된 "새" 데이터를 제대로 반영하려면 어떻게 해야 합니까?
갱신하다
그래서 내 스테이징 데이터가 우연히도 그 안에 있는 것을 반영할 수 있습니다.PRODUCTION
그리고 토론을 위해 다음과 같이 할 것입니다.
STAGING DATA TO MERGE:
1,"JOHN", 12;
2,"STEVE",15;
3,"BETTY",2;
두 번째 업데이트
실행하고자 하는 쿼리는 다음과 같습니다.
update PRODUCTION
set production.name = staging.name,
production.count = staging.count
where production.name = staging.name;
그러나 이로 인해 "staging.name "에서 잘못된 식별자 문제가 발생합니다.
당신이 시도하는 것을 하는 두 가지 방법이 있습니다.
UPDATE PRODUCTION a
SET (name, count) = (
SELECT name, count
FROM STAGING b
WHERE a.ID = b.ID);
병합을 사용할 수 있습니다.
MERGE INTO PRODUCTION a
USING ( select id, name, count
from STAGING ) b
ON ( a.id = b.id )
WHEN MATCHED THEN
UPDATE SET a.name = b.name,
a.count = b.count
해보세요..
UPDATE PRODUCTION a
SET (name, count) = (
SELECT name, count
FROM STAGING b
WHERE a.ID = b.ID)
WHERE EXISTS (SELECT 1
FROM STAGING b
WHERE a.ID=b.ID
);
업데이트 문을 선택할 수 없으므로 전체 테이블이 업데이트됩니다.특정 행(ID가 일치하는 위치)을 업데이트하려면 조정된 하위 쿼리를 수행해야 합니다.
그러나 오라클을 사용하고 있으므로 쿼리 테이블에 대한 구체화된 보기를 생성하고 오라클의 트랜잭션 메커니즘이 세부 정보를 처리하도록 하는 것이 더 쉬울 수 있습니다.MV는 의미론을 쿼리하는 테이블과 정확히 동일하게 작동하며 설정이 매우 쉬우며 새로 고침 간격을 지정할 수 있습니다.
스테이징 데이터 세트의 예가 없다면 이것은 암암리에 가능한 일입니다. 하지만 당신은 이런 것을 시도해 본 적이 있습니까?
update PRODUCTION p,
staging s
set p.name = s.name
p.count = s.count
where p.id = s.id
이 방법은 ID 열이 두 테이블에서 모두 일치한다고 가정할 수 있습니다.
언급URL : https://stackoverflow.com/questions/11692778/oracle-sql-update-based-on-subquery-between-two-tables
'programing' 카테고리의 다른 글
요소가 화면 밖에 있는지 확인하는 방법 (0) | 2023.09.01 |
---|---|
MariaDB 예기치 않은 토큰이 반환될 것 같습니다. (0) | 2023.09.01 |
스크립트가 포함된 AJAX 요청이 로드 및 실행될 때까지 자바스크립트 코드 실행을 대기하려면 어떻게 해야 합니까? (0) | 2023.08.27 |
페이지의 아무 곳에서나 Enter 키 캡처 누름 (0) | 2023.08.27 |
도커의 시간이 호스트의 시간과 동기화되는지 확인하는 방법은 무엇입니까? (0) | 2023.08.27 |