#sql #oracle
Есть две таблицы, с одинаковой структурой.
К примеру, Table1: (id, value) и такая же Table2 (id, value).
Нужно выбирать данные из таблиц по id следующим образом:
сначала посмотреть в Table1: если там есть строка с таким id, то взять ее. Если нет,
то посмотреть в таблицу Table2 и взять оттуда.
Можно ли это сделать одним SQL запросом?
Ответы
Ответ 1
select decode(T1.id,NULL,T2.value,T1.value) from (select 341 as id from DUAL) A left join table1 T1 on T1.id=A.Id left join table2 T2 on T2.id=A.Id Вот так, 341 - это искомый ID. То же самое в чисто орракловом стиле, как мне больше нравится, т.к. короче: select decode(T1.id,NULL,T2.value,T1.value) from (select 341 as id from DUAL) A, table1 T1, table2 T2 where T1.id(+)=A.Id and T2.id(+)=A.Id Пояснение: когда в T1 запись не нашлась, то ее ID=NULL значит нам надо взять значение из T2, иначе из T1. Для других СУБД вместо decode можно применить case when T1.id is null then T2.value else T1.value end. Если выборка нужна для многих записей, то что нибудь в этом роде (по подсказке Stack), только для версий Oracle >= 9i : select nvl(T1.id,T2.id) as id, decode(T1.id,NULL,T2.value,T1.value) as value from table1 T1 full join table2 T2 on T2.id=T1.idОтвет 2
Если у Вас полностью одинаковые таблицы, может не стоит так делать, а разместить всё в одной- просто добавить там поле, которое чем-то отличает значения? а создавать табл 1,2,3,4...х с одинаковой структурой, потом ломать голову, как это обработать- как-то не вариант... Создайте Table (id, value,table) -ну table- это поле, почему вы разделили на таблицу 1 и 2Ответ 3
WITH tmp AS ( SELECT * FROM table1 WHERE id = 13 ) SELECT tmp.* FROM tmp UNION ALL SELECT table2.* FROM (SELECT 1 FROM dual WHERE NOT EXISTS(SELECT 1 FROM tmp)), table2 WHERE id = 13 Запрос получается более громоздкий чем предложил Mike. Но в данном случае может быть несколько плюсов, которые зависят от структуры таблиц. Выборка по таблице Table2 не будет производиться, если в первой таблице не оказалось записей. Может пригодится в том случае если отсутствуют индексы по полю id. В случае если id не уникально. При использовании джоинов таблиц мы получим перемножение данных (как пример в каждой таблице есть по две записи с искомым id, используя left или full мы на выходе получим 4 строчки). Данный же запрос не допустит такого перемножения. Во всех остальных случаях запросы предложенные Mike удобней и понятней для восприятия.Ответ 4
Могу предложить такой вариант: SELECT id ,value FROM ( SELECT id ,value ,1 select_order FROM Table1 UNION ALL SELECT id ,value ,2 select_order FROM Table1 ) X WHERE X.id =ORDER BY select_order LIMIT 1 UPDATE Тут в комментариях подсказывают, что в oracle нет limit - поэтому нужно его заменить на аналог в oracle
Комментариев нет:
Отправить комментарий