Соединения Outter не работают "как ожидалось" в этом случае, потому что Вы явно сказали 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 = ?)
)
[Редактирование], Если Вы ожидаете несколько строк от подвыбора, можно добавить ROWNUM=1 к каждому, где пункт ИЛИ использует агрегат, такой как МАКС или МИН. Это, конечно, не может быть лучшим решением для всех случаев.
[Редактирование] На комментарий,
(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. Это было бы полезно для знания.
Можно иметь дело с возможностью Вашего связывать переменную, являющуюся пустым использованием ИЛИ следующим образом. Вы связали бы то же самое с первыми двумя, связывают переменные.
Если бы Вы обеспокоены производительностью, Вас было бы лучше проверить, являются ли значения, которые Вы намереваетесь связать, нулевыми или не и затем выпускают другой 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))
Попытка:
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(), '');