Oracle SQL: объединение с большим количеством условий, чем сопоставлено / не сопоставлено - PullRequest
1 голос
/ 28 декабря 2011

Мне нужна помощь с командой MERGE в Oracle. В основном у меня есть эта команда, но я хочу еще немного ее оптимизировать:

MERGE INTO swap USING dual ON (SELECT id FROM student WHERE number = '123') 
WHEN MATCHED THEN 
  UPDATE SET swapped = 1, last_swap = sysdate 
WHEN NOT MATCHED THEN 
  INSERT (student_id, swapped, last_swap) VALUES ((SELECT id FROM student WHERE number= '123'), 1, sysdate)

Прямо сейчас это вставит или обновит регистр в таблице SWAP. Однако я хотел бы защитить его от вставки NULL в student_id, если в таблице STUDENT нет ученика с таким номером (я не хочу просто не разрешать значения NULL для sudent_id таблицы SWAP). Другое дело, я повторяю SELECT id FROM student WHERE number = '123' два раза, как я могу изменить это, чтобы выполнить его только один раз (сохранить результат в псевдониме или что-то в этом роде)?

Заранее большое спасибо!

1 Ответ

2 голосов
/ 28 декабря 2011

В вашем заявлении о слиянии следует использовать «Выбрать из студента» в качестве таблицы, из которой вы объединяетесь. Можете ли вы опубликовать некоторые образцы данных?

В приведенном ниже запросе предполагается, что ID - это столбец, в котором вы объединяетесь, и он не может быть пустым.

MERGE INTO swap 
      USING (SELECT id FROM student WHERE number = '123' and id is not null) stu
      on (stu.id = swap.id)
WHEN MATCHED THEN 
  UPDATE SET swapped = 1, last_swap = sysdate 
WHEN NOT MATCHED THEN 
  INSERT (student_id, swapped, last_swap) VALUES (stu.id , 1, sysdate);
...