递归 CTE - 返回奇数和偶数记录
Recursive CTE - Returning odd and even records
非常卡住,希望有人能提供帮助
我需要使用一个通用的 table 表达式首先显示 (select) 所有奇数 Employee_ID 行,然后显示员工的所有偶数 Employee_ID 行table。
这是我到目前为止写的,绝对不正确。如果有人可以提供帮助,那就太好了。
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
试试这个
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
您只需要添加一个类似于下面的 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
为什么要使用 CTE,不需要满足排序条件。
select * from employees
order by (employee_id % 2) DESC, employee_id
nb:这假设 % 用于您的 dbms 中的模数
例如3 % 2 = 1, 4 % 2 = 0
我使用此代码使用递归 CTE 制作了 1 到 99 个奇数的序列
WITH oddnumber AS
(
SELECT 1 AS MYNUMBER
UNION ALL
SELECT 1+(MYNUMBER) FROM ODDNUMBER
WHERE MYNUMBER<100
)
SELECT MYNUMBER
FROM oddnumber
WHERE MYNUMBER%2=1
非常卡住,希望有人能提供帮助
我需要使用一个通用的 table 表达式首先显示 (select) 所有奇数 Employee_ID 行,然后显示员工的所有偶数 Employee_ID 行table。
这是我到目前为止写的,绝对不正确。如果有人可以提供帮助,那就太好了。
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
试试这个
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
您只需要添加一个类似于下面的 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
为什么要使用 CTE,不需要满足排序条件。
select * from employees
order by (employee_id % 2) DESC, employee_id
nb:这假设 % 用于您的 dbms 中的模数
例如3 % 2 = 1, 4 % 2 = 0
我使用此代码使用递归 CTE 制作了 1 到 99 个奇数的序列
WITH oddnumber AS
(
SELECT 1 AS MYNUMBER
UNION ALL
SELECT 1+(MYNUMBER) FROM ODDNUMBER
WHERE MYNUMBER<100
)
SELECT MYNUMBER
FROM oddnumber
WHERE MYNUMBER%2=1