2015-08-12 3 views
0

Довольно застрял и надеясь кто-то может помочьРекурсивный CTE - Возвращение нечетным и даже записи

мне нужно использовать общее выражение таблицы в первой, а затем отобразить (выбрать) все нечетные строки EMPLOYEE_ID все еще EMPLOYEE_ID строки из таблица сотрудников.

Это то, что я написал до сих пор, определенно не правильно. Было бы здорово, если кто-то может помочь.

WITH MYCTE (Employee_ID) 
AS (
    SELECT 1 AS odd 
    FROM Employee 

    UNION ALL 

    SELECT odd + 1 
    FROM Employee 
    WHERE odd < 10 
    ) 
SELECT * 
FROM MYCTE 
ORDER BY CASE 
     WHEN odd % 2 = 1 
      THEN 0 
     ELSE 1 
     END 
    ,odd ASC 
+0

Вы не можете указать заказ в CTE! Просто добавьте ORDER BY в основной запрос. 'SELECT * FROM Employee_Table ORDER BY Employee_ID & 1 DESC, Employee_ID' – adrianm

+1

Элемент * only *, который управляет порядком результатов, является предложением ORDER BY в последнем/внешнем запросе. –

+0

какой dbms поставщик это для пожалуйста –

ответ

1

Все, что вам нужно, это добавить ORDER BY аналогичный приведенному ниже:

order by case when odd%2 = 1 then 0 else 1 end, odd asc

Вот пример SQLFiddle.

Добавлен в ваш код, это будет выглядеть так:

With MYCTE(Employee_ID) 
As 
(
Select 1 as odd 
From Employee_Table 

UNION ALL 

Select odd + 1 
From Employee_Table 
) 
Select * 
From MYCTE 
ORDER BY CASE 
      WHEN Employee_ID%2 = 1 
       THEN 0 
      ELSE 1 
     END, Employee_ID ASC 

После более близкого осмотра я заметил, что ваш Рекурсивный CTE не был построен правильно, поэтому вы получаете постоянные ошибки.

Я переписал ваш CTE, и теперь он должен работать должным образом. Также просмотрите this SQLFiddle, чтобы увидеть результаты.

with mycte (empID, employee_name, reportsTo) 
as (
    select 
     employee_id 
     , employee_nm 
     , reportsTo 
    from employee 
    where reportsto = 0 

    union all 

    select 
     e.employee_id 
     , e.employee_nm 
     , e.reportsTo 
    from employee e 
     inner join mycte mc on e.reportsTo = mc.empID   
) 
select * 
from mycte 
order by case 
      when empID%2 = 1 
       then 0 
      else 1 
      end, empID ASC 
+0

Спасибо. Когда я запускаю запрос, он говорит, что odd является недопустимым именем столбца. Есть идеи? –

+0

@ShiyuZhu Повторить сейчас. Я изменил имя столбца с 'odd' на' Employee_ID' в 'ORDER BY' (это была моя ошибка). –

+0

Вы имеете в виду вот это? –

0

Попробуйте

select t.* from 
(
Select row_number() over (order by (select 1)) as sno, * From Employee_Table 
) as t 
order by case when sno%1=1 then 1 else 2 end, sno 
0

Зачем использовать CTE вообще, это не обязательно должно соответствовать критериям сортировки.

select * from employees 
order by (employee_id % 2) DESC, employee_id 

NB: Это предполагает,% используется для по модулю в ваших DBMS

например 3% 2 = 1, 4% 2 = 0

+0

Он не хочет фильтровать сотрудников на основе четных или нечетных значений id. Он хочет, чтобы все они вернулись и приказали (снова прочитайте вопрос). –

+0

(да, но баланс прост и теперь показан) до сих пор не вижу необходимости в CTE –

+0

oops, но имел ли он неправильный путь вверх –

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