SQL ORACLE集合运算符
我有一个练习,要求向部门10,20,50出示职务id和部门id,并按照10,50,20的具体顺序进行订购 我的选择语句SQL ORACLE集合运算符,sql,oracle,Sql,Oracle,我有一个练习,要求向部门10,20,50出示职务id和部门id,并按照10,50,20的具体顺序进行订购 我的选择语句 select job_id,department_id from employees INTERSECT select job_id,department_id from employees where department_id IN (10,20,50) ORDER BY 2,CASE department_id WHEN 10 then 1
select job_id,department_id
from employees
INTERSECT
select job_id,department_id
from employees
where department_id IN (10,20,50)
ORDER BY 2,CASE department_id WHEN 10 then 1
WHEN 50 then 2
WHEN 20 then 3
ELSE THEN 4
END
消息输出为
ORA-01785:ORDER BY item必须是选择列表表达式的编号
您可以使用大小写表达式进行条件排序:
select job_id, department_id
from employees
where department id in (10, 20, 50)
order by
case department_id
when 10 then 1
when 50 then 2
when 20 then 3
end,
job_id
这将根据您的自定义部门订单,然后根据作业id来订购记录
由于您使用的是Oracle,因此可以使用decode缩短order by子句:
注意:我在这个查询中没有看到相交点,所以我删除了它;但如果出于某种原因需要if,上述order by子句仍将保持不变。语句中存在语法错误。在ORDERBY子句中,您应该使用
CASE department_id WHEN 10 then 1
WHEN 50 then 2
WHEN 20 then 3
ELSE 4
END
而不是
CASE department_id WHEN 10 then 1
WHEN 50 then 2
WHEN 20 then 3
ELSE THEN 4
END
基本上,您不应该将THEN放在ELSE子句中。查询中的case语句存在问题 您没有正确使用case语句,ELSE子句中缺少值 此外,您提到的要求不需要INTERSECT <> P>你可以简单地考虑这样的事情,将50作为11,使10-50-20转换为10-11-20阶。
SELECT
JOB_ID,
DEPARTMENT_ID
FROM
EMPLOYEES
WHERE
DEPARTMENT_ID IN (
10,
20,
50
)
ORDER BY
DECODE(DEPARTMENT_ID, 50, 11, DEPARTMENT_ID) , JOB_ID
干杯 我不明白为什么要将intersect用于此查询。因为实践要求使用set operate进行此查询。我不认为这是你想要的,即使代码有效。你可能想问一个新问题,包括样本数据、期望结果、,以及您想要的逻辑解释。实践要求使用set operate执行此查询,我执行了您向我提到的操作,但我仍然有相同的错误。我找到了解决方案,将此查询用作表并从中检索结果,然后按特定顺序对其进行排序语法为SELECT job\u id,department\u id from SELECT job\u id,员工交集中的部门id从员工中选择工作id、部门id,其中部门id按其帮助您的部门id、10、1、50、2、20、3、4的顺序排列在10、20、50中。!!
SELECT
JOB_ID,
DEPARTMENT_ID
FROM
EMPLOYEES
WHERE
DEPARTMENT_ID IN (
10,
20,
50
)
ORDER BY
DECODE(DEPARTMENT_ID, 50, 11, DEPARTMENT_ID) , JOB_ID