2014-01-29 2 views
2

У меня есть 2 таблицы, которые я объединяю и хочу сделать заказ, используя ORDER BY CASE, но я продолжаю получать ORA-01785: ORDER BY должен быть номером ошибки выражения SELECT-списка.Oracle SQL Custom Sort with Union

Мои 2 таблицы имеют столбец с именем "ВИЗИТ", содержащий (что-то подобное) следующие данные:

Followup стол: BASELINE, 1_MONTH, 2_MONTH

Процедура таблице: ПРОЦЕДУРА

Я хочу союза этих таблиц и сортировки в следующем порядке: BASELINE, ПРОЦЕДУРА, 1_MONTH, 2_MONTH

Вот что я думаю, что должно работать:

SELECT VISIT 
FROM FollowUp 
UNION 
SELECT VISIT 
FROM Procedure 
ORDER BY 
    CASE VISIT 
    WHEN 'BASELINE' THEN 1 
    WHEN 'PROCEDURE' THEN 2 
    WHEN '1_MONTH' THEN 3 
    WHEN '2_MONTH' THEN 4 
    ELSE 5 END 

Однако я получаю ошибку 01785. Я также попытался заменить CASE VISIT на CASE 1 и получить ту же ошибку. Спасибо вам за помощь!

+1

Так как вы заказываете объединение результирующего набора я хотел бы предложить вам, чтобы положить его внутрь paranthesis. 'ВЫБОР ВИЗИТ ОТ (SELECT ВИЗИТ ИЗ Followup СОЕДИНЕНИЕ ВЫБОР ВИЗИТ ОТ процедуры) ORDER BY СЛУЧАЙ VISIT КОГДА 'ИСХОДНЫЕ' ТОГДА 1 КОГДА 'ПРОЦЕДУРА' ТОГДА 2 КОГДА '1_MONTH' ТОГДА 3 , когда" 2_MONTH 'THEN 4 ELSE 5 END' – arunb2w

+0

Неверный ваш логин. 1,2,3,4 заканчивается ссылкой на номер столбца результирующего набора, но у вас есть только один столбец (посещение). – OldProgrammer

ответ

2

Попробуйте делать это с помощью подзапроса:

select visit 
from ((SELECT VISIT 
     FROM FollowUp 
    ) union 
     (SELECT VISIT 
     FROM Procedure 
    ) 
    ) t 
ORDER BY 
    CASE VISIT 
    WHEN 'BASELINE' THEN 1 
    WHEN 'PROCEDURE' THEN 2 
    WHEN '1_MONTH' THEN 3 
    WHEN '2_MONTH' THEN 4 
    ELSE 5 END; 

Если вам не нужно дублировать удаление, а затем использовать union all.

+0

Спасибо! Мне нужно дублировать удаление. – user3182246

0

Попробуйте это:

SELECT VISIT, CASE VISIT WHEN 'BASELINE' THEN 1 WHEN 'PROCEDURE' THEN 2 WHEN '1_MONTH' THEN 3 WHEN '2_MONTH' THEN 4 ELSE 5 END ORDERFIELD FROM FollowUp UNION SELECT VISIT, CASE VISIT WHEN 'BASELINE' THEN 1 WHEN 'PROCEDURE' THEN 2 WHEN '1_MONTH' THEN 3 WHEN '2_MONTH' THEN 4 ELSE 5 END ORDERFIELD FROM Procedure ORDER BY ORDERFIELD

2

Попробуйте это:

SELECT x.visit, 
     CASE x.VISIT 
      WHEN 'BASELINE' THEN 1 
      WHEN 'PROCEDURE' THEN 2 
      WHEN '1_MONTH' THEN 3 
      WHEN '2_MONTH' THEN 4 
      ELSE 5 
     END 
      sort_by 
    FROM (SELECT VISIT FROM FollowUp 
      UNION ALL 
      SELECT VISIT FROM Procedure) x 
ORDER BY SORT_BY