Oracle 삽입을 통해 선택에서 여러 테이블은 한 테이블이 없을 수 있 행

StackOverflow https://stackoverflow.com/questions/131164

  •  02-07-2019
  •  | 
  •  

문제

나의 코드 값은 테이블을 포함하는 코드에 대한 설명과 함께 오랜 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(), '');
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top