Oracle 삽입을 통해 선택에서 여러 테이블은 한 테이블이 없을 수 있 행
문제
나의 코드 값은 테이블을 포함하는 코드에 대한 설명과 함께 오랜 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 이 될 수 없습니다.물론,암시적 가 반환하지 않는 행,그래서 행하지 않을 얻을 삽입이 있습니다.
해봤을 사용하여 NVL 에서?에 r.recipient_id.
내가 하려고 했는 외부에서 참 r.recipient_code=?을 추가하여(+),하지만 명시적 결합,그래서 오라클이 여전히 추가하지 않는 다른 행이 있습니다.
누구나 알고의 방법이었는지 설명하려고 노력합니다.
나는 분명히 수정하는 문서 내가 조회의 recipient_id 외부에서,그리고?대 r.recipient_id,과하지 않는에서 선택 받는 테이블에서든지만 이 모든 작업을 수행하려면 1 에서 SQL 문입니다.
해결책
Outter 인 작동하지 않으로"예"그 경우에 당신이 있기 때문에 명시적으로 말 Oracle 당신만 원하는 데이터는 경우에는 그 기준에는 테이블과 일치합니다.에는 시나리오 outter 가입를 사용할 수 없게 됩니다.
력
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 = ?)
)
[편집] 할 경우 여러 행에서 선택,추가할 수 있습니다 ROWNUM=1 을 각 where 절을 사용하거나 집계 등 MAX,MIN.이 코스의하지 않을 수 있습을위한 최고의 솔루션이 될 경우도 있습니다.
[편집]당 댓글
(SELECT account_type_standard_seq.nextval FROM DUAL),
수
account_type_standard_seq.nextval,
다른 팁
약간의 단순화 된 버전 Oglester 의 솔루션(순서를 요구하지 않는에서 선택 듀얼:
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.도움이 될 것이라 알고 있습니다.
다룰 수 있는 가능성의 bind 변수가 null 이 사용하는 다음과 같습니다.당신이 바인딩은 동일한 것이 첫 번째와 두 번째 bind 변수입니다.
당신이 우려하는 성과에 관하여,당신은 더 나은 것을 확인하는 경우에는 값에는 바인딩은 null 또는지와 다음 문제는 다른 SQL 문을 방지하거나.
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))
Try:
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(), '');