Объединить два SQL-запроса с условием if

Я хочу объединить два запроса.

У меня есть Query1, возвращающий некоторые идентификаторы.

Затем у меня есть Query2, который сначала проверяет наличие некоторых идентификаторов в таблице. Если нет, результатом будут идентификаторы, возвращаемые Query1.

Если да, то мне нужны общие идентификаторы, которые возвращаются Query1 и Query2, как пересечение идентификаторов, возвращаемых Query1 и Query2.

Итак, как я могу сделать это в одном запросе.


person user1049021    schedule 09.04.2012    source источник
comment
вы можете увидеть это: stackoverflow.com/questions/38549/ Посмотрите, что в основном называется LEFT OUTER JOIN, а также INNER JOIN для ваших требований соответственно.   -  person nawfal    schedule 09.04.2012
comment
в настоящее время я получаю результат Query1 в таблице данных и Query2 в другой таблице данных. Затем перебираем эти таблицы данных, получая общие идентификаторы и вставляя их в третьи таблицы данных. Я хочу минимизировать это.   -  person user1049021    schedule 09.04.2012
comment
Да, вместо этого вы можете выполнить один запрос, который также является стандартным. Используйте JOIN. Вы не до конца разбираетесь в этом?   -  person nawfal    schedule 09.04.2012
comment
@nawfal - мне понятно с концепцией соединений, но в данном случае это бесполезно.   -  person user1049021    schedule 09.04.2012
comment
ты прав, я пропустил момент. какую бд вы используете? для этого нужна какая-то логика if else в запросе (насколько я знаю). это можно легко сделать на сервере sql. Кстати, хороший вопрос!   -  person nawfal    schedule 09.04.2012
comment
да, это можно сделать в sql.. я сделал это.. но я использую и сервер sql, и оракул. для хранения подсчета, а затем условия if. Это не очень хорошо для встроенного запроса. Я не хочу добавлять sproc или функцию в db для такой простой задачи, как ее повторное использование.   -  person user1049021    schedule 10.04.2012
comment
Точно, что-то хлопотное в mysql, в котором я пытался - вам нужен storeproc. TSQL здесь выглядит круто. Не могли бы вы опубликовать ответ здесь?   -  person nawfal    schedule 10.04.2012
comment
вам обязательно следует подумать о добавлении базы данных, которую вы используете в этих вопросах, иначе это бессмысленно.   -  person nawfal    schedule 10.04.2012
comment
@ user1049021 Вы являетесь участником уже более года, задали 10 вопросов и не ответили НИ ОДНОГО. Я не могу поверить, что все они не достойны и приняты крючком. (Если вы не понимаете, что я имею в виду, см. FAQ.)   -  person Angelo Fuchs    schedule 11.04.2012


Ответы (2)


Этого можно добиться с помощью комбинации оператора DECODE и CASE


SELECT DISTINCT BT1.ID
  FROM BUFFER_TABLE_1 BT1, BUFFER_TABLE_2 BT2
 WHERE DECODE((SELECT COUNT(BT1.ID)
                FROM BUFFER_TABLE_1 BT1, BUFFER_TABLE_2 BT2
               WHERE BT1.ID = BT2.ID),
              0,
              'TRUE',
              (SELECT CASE
                        WHEN BT1.ID = BT2.ID THEN
                         'TRUE'
                        ELSE
                         'FALSE'
                      END
                 FROM DUAL)) = 'TRUE'
 ORDER BY BT1.ID
.

Основная часть используется в декодировании, где в случае, если количество совпадающих идентификаторов из обеих таблиц равно НУЛЮ, тогда все идентификаторы возвращаются из 1-й таблицы (BUFFER_TABLE_1). Однако в случае, если это число больше 0, идентификаторы в обеих таблицах сопоставляются и возвращаются только общие идентификаторы.

Надеюсь, поможет

person Rohan    schedule 11.04.2012

(Для людей, которые уже прочитали мой ответ: он был сильно отредактирован из-за комментариев @nawfal, которые я хочу сохранить)

Сначала хочу уточнить, что я правильно понял вашу проблему.

У вас есть части:

  1. select id from table1 Это дает Result1
  2. select id from table2 where <some condition> Это дает Result2
  3. select count(id) > 0 from table2 where <some condition> Это решает, какой результат использовать

Если 3. возвращает более 1, вам нужны строки, которые возвращаются 1. И 2. (но не те, которые возвращаются только 1. ИЛИ только 2.)

Если 3. возвращает 0, вам нужны результаты 1.

-> Решение состоит в том, чтобы иметь 3. в представлении и выбирать его в предложении where оператора union ДВАЖДЫ.

Как это:

SELECT t1.id FROM table1 t1 WHERE 
       (SELECT COUNT(t2.id) from table2 t2 where <some condition>) = 0
UNION
select t2.id from table2 t2 WHERE <some condition> 
       AND t2.id IN (SELECT t1.id FROM table1 t1)
       AND (SELECT COUNT(t2.id) from table2 t2 where <some condition>) > 0

одна из двух частей всегда будет пустой (поскольку запрос 3. не может быть = 0 и > 0 одновременно)

person Angelo Fuchs    schedule 09.04.2012
comment
мои запросы: выберите * из таблицы1 выберите * из таблицы2 из таблицы2, где ‹некоторое условие›, что я хочу: и query2 else //Идентификаторы из query1 Надеюсь, теперь я изложил свой вопрос более ясно - person user1049021; 09.04.2012
comment
@user1049021 user1049021, пожалуйста, разместите свои запросы в редактировании вашего вопроса. - person Angelo Fuchs; 09.04.2012
comment
Никакой союз не даст дубликатов записей - person user1049021; 09.04.2012
comment
@AngeloNeuschitzer это именно то, что пришло мне в голову, но это не дает ему желаемого результата. Когда в таблице 2 есть запись, первый запрос возвращает 0 записей, и объединение больше не работает. В этом сценарии ему нужен своего рода пересечение.. Несколько исправлений: сделать объединение всех в объединение, изменить == на =. что ему нужно, так это какая-то логика потока управления - person nawfal; 09.04.2012
comment
@nawfal Нет, Union all объединит все выбранные внутри. Если вы убедитесь, что первый запрос будет давать результаты только в том случае, если второй не будет, вы всегда будете иметь либо первый, либо второй, но никогда оба. - person Angelo Fuchs; 09.04.2012
comment
Я понимаю, что вы имеете в виду, но это не требование ОП. Он хочет пересечение значений из таблицы1 и таблицы2, если в таблице2 есть некоторые значения, которые не дает ваш запрос. Ваш запрос работает, когда в таблице 2 нет идентификатора. В этом случае союз работает. - person nawfal; 09.04.2012
comment
Хорошо, просто скажите мне две вещи: во-первых, какая разница в вашем коде, если объединение всех сделано объединением? во-вторых, если (select count(*) from table2 from table2 where <some condition> ) == 0 неверно (что означает, что в таблице 2 есть некоторые значения идентификатора), то как ваш запрос будет соответствовать потребностям OP? Хотя я сам с треском провалился. Я могу придумать что угодно, что не разбивает запрос на два отдельных. - person nawfal; 09.04.2012
comment
во-первых: союз против союза все: кажется, что здесь его нет. Я как-то напутал... чешет затылок извините, поправлю. Другой: я понимаю, что вы имеете в виду и почему мое решение не подходит (пока). Я расширю его. - person Angelo Fuchs; 11.04.2012
comment
@nawfal Итак, я переписал свой ответ, надеюсь, теперь он более понятен. - person Angelo Fuchs; 11.04.2012