Oracle Вставляет через Выбор из нескольких таблиц, где одна таблица не может поссориться

12
задан Mikezx6r 25 September 2008 в 02:27
поделиться

5 ответов

Соединения 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,
23
ответ дан 2 December 2019 в 04:17
поделиться

Немного упрощенная версия решения 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 = ?)
)
7
ответ дан 2 December 2019 в 04:17
поделиться

Мне в вопросе не было ясно, если 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))
3
ответ дан 2 December 2019 в 04:17
поделиться

Попытка:

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 = ?
3
ответ дан 2 December 2019 в 04:17
поделиться
insert into received_messages(id, content, status)
    values (RECEIVED_MESSAGES_SEQ.NEXT_VAL, empty_blob(), '');
-2
ответ дан 2 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: