2016-11-11 6 views
0

У меня есть два запроса, которые я пытаюсь объединить в один. Упрощенная версия того, что я делаю:Как скомпоновать два оператора SELECT

SELECT * FROM table WHERE `id` = '1' ORDER BY `name` 
SELECT * FROM table WHERE `id` = '2' ORDER BY `age` 

Я посмотрел в союзах, но примеры, которые я найти в Интернете меньше, чем полезны.

+2

Я думаю, что вы ищете 'union' или' union all'. Также какие СУБД вы используете? –

+0

'где id в (1,2)'. – jarlh

+0

SELECT * FROM table WHERE id IN (1, 2) ORDER BY имя, возраст – Beginner

ответ

1

Вы можете искать что-то вроде этого:

SELECT * FROM YourTable 
WHERE id in('1','2') 
ORDER BY id,CASE WHEN id=1 THEN age END,CASE WHEN id=2 THEN name END 

Поскольку идентификатор является частью результирующего, там нет необходимости в UNION или других сложных трюках.

Я уверен, что age и name - это не то же самое. Один из CASE WHEN может попасть в беду здесь.

В моем предложении ORDER BY использует три столбца . Это приведет к

ORDER BY 1,age,NULL 

или

ORDER BY 2,NULL,name 
+0

Хотя это работает, и я могу понять, почему, мне любопытно, как изменить порядок. Так, например, если бы я хотел, чтобы возраст был ASC, а имя - DESC. – Robbie

+0

Просто добавьте 'ASC' или' DESC' для каждого столбца отдельно как последнее ключевое слово ... – Shnugo

+0

Это то, что я предположил, но я получил ошибку «недопустимый синтаксис». – Robbie

0

Приведенный ниже код просто объединяет результаты каждого из них. Это не так много.

SELECT * FROM table WHERE `id` = '1' ORDER BY `name` 
union 
SELECT * FROM table WHERE `id` = '2' ORDER BY `age` 
+2

Эти ORDER BY недействительны и не имеют смысла. – jarlh

+0

Это не сработало? –

+2

Не в ANSI SQL. Возможно, какой-то менее строгий продукт dbms выполнит его? – jarlh

0

Применить оператор Union между обоими запросами. Пожалуйста, позаботьтесь о выборе же имя столбца и последовательности в обеих запросы как ниже:

SELECT id,columnname1,columnname2 FROM table WHERE id = '1' 
union 
SELECT id,columnname1,columnname2 FROM table WHERE id = '2' 
+0

Это точно так же, как 'select ... from table, где id в (1,2)' просто с большим количеством накладные расходы ... – Shnugo

0

выберите * от (выберите идентификатор из table1, где ID = 1 заказ по идентификатору) UNION SELECT * FROM (выберите идентификатор из table2, где ID = 2 порядка по имени); это отлично работает с оракулом.

+0

1) Нет необходимости в 'UNION' вообще (см. Существующие ответы) и 2) Уместно использовать только * outer-most *' ORDER BY'. Этот вызов может вернуться в другом порядке от звонка до звонка ... – Shnugo

+0

Да, он получил его. спасибо за ваше драгоценное время .. –

Смежные вопросы