Oracle Insert via 한 테이블에 행이 없을 수 있는 여러 테이블 중에서 선택
코드와 긴 ID의 설명이 포함된 코드 값 테이블을 여러 개 가지고 있습니다.
이제 여러 코드를 참조하는 계정 유형에 대한 항목을 만들고 싶으므로 다음과 같은 것이 있습니다.
insert into account_type_standard (account_type_Standard_id,
tax_status_id, recipient_id)
( select account_type_standard_seq.nextval,
ts.tax_status_id, r.recipient_id
from tax_status ts, recipient r
where ts.tax_status_code = ?
and r.recipient_code = ?)
각 코드에 일치하는 값이 발견되면 tax_status 및 수신인 테이블에서 적절한 값을 검색합니다.유감스럽게도 recipient_code는 null이므로 ? 대체 값이 null일 수 있습니다.물론 암묵적 조인은 행을 반환하지 않으므로 내 테이블에 행이 삽입되지 않습니다.
?와 r.recipient_id에서 NVL을 사용해 보았습니다.
(+)를 추가하여 r.sys_code = ?에서 외부 조인을 강제로 시도했지만 명시적 조인이 아니므로 Oracle은 여전히 다른 행을 추가하지 않았습니다.
이거 어떻게 하는지 아는 사람?
외부에서 recipient_id를 조회하고 r.recipient_id 대신 ?를 사용하도록 문을 분명히 수정할 수 있으며 수신자 테이블에서 선택하지는 않지만 이 모든 것을 하나의 SQL 문으로 수행하고 싶습니다.
외부 조인은 해당 테이블의 기준이 일치하는 경우에만 데이터를 원한다고 Oracle에 명시적으로 말했기 때문에 "예상대로" 작동하지 않습니다.이 시나리오에서는 외부 조인이 사용되지 않습니다.
해결 방법
INSERT INTO account_type_standard
(account_type_Standard_id, tax_status_id, recipient_id)
VALUES(
(SELECT account_type_standard_seq.nextval FROM DUAL),
(SELECT tax_status_id FROM tax_status WHERE tax_status_code = ?),
(SELECT recipient_id FROM recipient WHERE recipient_code = ?)
)
[편집] 하위 선택에서 여러 행이 예상되는 경우 각 where 절에 ROWNUM=1을 추가하거나 MAX 또는 MIN과 같은 집계를 사용할 수 있습니다.물론 이것이 모든 경우에 최선의 해결책은 아닐 수 있습니다.
[편집] 댓글당
(SELECT account_type_standard_seq.nextval FROM DUAL),
정당할 수 있습니다
account_type_standard_seq.nextval,
약간 단순화된 버전의 Oglester 솔루션(DUAL에서 선택할 필요가 없는 시퀀스):
INSERT INTO account_type_standard
(account_type_Standard_id, tax_status_id, recipient_id)
VALUES(
account_type_standard_seq.nextval,
(SELECT tax_status_id FROM tax_status WHERE tax_status_code = ?),
(SELECT recipient_id FROM recipient WHERE recipient_code = ?)
)
ts.tax_status_code가 기본 키인지 대체 키인지 질문에서 명확하지 않았습니다.recipient_code와 동일합니다.이것은 알아두면 유용할 것입니다.
다음과 같이 OR을 사용하여 바인딩 변수가 null일 가능성을 처리할 수 있습니다.처음 두 바인딩 변수에 동일한 항목을 바인딩합니다.
성능이 걱정되는 경우 바인딩할 값이 null인지 확인한 다음 다른 SQL 문을 발행하여 OR을 피하는 것이 좋습니다.
insert into account_type_standard
(account_type_Standard_id, tax_status_id, recipient_id)
(
select
account_type_standard_seq.nextval,
ts.tax_status_id,
r.recipient_id
from tax_status ts, recipient r
where (ts.tax_status_code = ? OR (ts.tax_status_code IS NULL and ? IS NULL))
and (r.recipient_code = ? OR (r.recipient_code IS NULL and ? IS NULL))
시도:
insert into account_type_standard (account_type_Standard_id, tax_status_id, recipient_id)
select account_type_standard_seq.nextval,
ts.tax_status_id,
( select r.recipient_id
from recipient r
where r.recipient_code = ?
)
from tax_status ts
where ts.tax_status_code = ?
insert into account_type_standard (account_type_Standard_id, tax_status_id, recipient_id)
select account_type_standard_seq.nextval,
ts.tax_status_id,
( select r.recipient_id
from recipient r
where r.recipient_code = ?
)
from tax_status ts
where ts.tax_status_code = ?
insert into received_messages(id, content, status)
values (RECEIVED_MESSAGES_SEQ.NEXT_VAL, empty_blob(), '');
언급URL : https://stackoverflow.com/questions/131164/oracle-insert-via-select-from-multiple-tables-where-one-table-may-not-have-a-row
'programing' 카테고리의 다른 글
Swift UI 해제 모달 (0) | 2023.08.05 |
---|---|
전자 메일을 보내기 위해 Send-MailMessage 명령에 자격 증명을 전달하는 방법 (0) | 2023.08.05 |
'root@localhost' 사용자에 대한 액세스가 거부되었습니다(암호 사용:아니오) (0) | 2023.08.05 |
오류와 함께 npm 설치 오류: ENOENT, chmod (0) | 2023.08.05 |
하나의 블록에 여러 개의 시도 코드가 있음 (0) | 2023.08.05 |