oracle中在in子查询语句中order by排序能否用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中在in子查询语句中order by排序能否用?相关的知识,希望对你有一定的参考价值。

如题,现在oracle数据库中有一个表org_master(org_id,org_name,org_parent_id,org_order)
表内数据是
序号,名称,上级ID,排序ID
1, 市局, 0, 1
2, 县5, 1, 5
3, 县1, 1, 1
4, 县3, 1, 3
5, 县2, 1, 2
6, 县4, 1, 4
7, 企业1, 2, 1
8, 企业2, 2, 2
9, 企业3, 3, 3
10,企业4, 3, 4
11,企业5, 4, 5
12,企业6, 4, 6
13,企业7, 5, 7
14,企业8, 5, 8
15,企业9, 6, 9
16,企业10, 6, 10
.
.
.

现在要查询出前三十条所有县的中的企业,而且要按照县的org_order排序
我写的语句是
SELECT ORG_ID,ORG_NAME,ORG_PARENT_ID FROM ORG_MASTER
WHERE ORG_PARENT_ID in (SELECT ORG_ID FROM ORG_MASTER WHERE ORG_PARENT_ID=1 ORDER BY ORG_ORDER)
AND ROWNUM <=30
运行语句数据库会报缺少右括号的异常,去掉ORDER BY ORG_ORDER运行就没有错误,我用的是版本是9i,网上说子句中可以用ORDER BY,谁能给看下怎么回事啊,或有什么方法查出来?
这里必须要用order by 排序,因为用户要求的,县的上下顺序可以修改,这里不用讨论这个问题

我用

SELECT ORG_ID,ORG_NAME,ORG_PARENT_ID,TYPE_ID FROM ORG_MASTER WHERE ORG_PARENT_ID in (SELECT ORG_ID FROM(SELECT ORG_ID FROM ORG_MASTER WHERE ORG_PARENT_ID=1 order by org_order))AND ROWNUM <=30

查出来了,但是出来的结果不对,单独运行SELECT ORG_ID FROM(SELECT ORG_ID FROM ORG_MASTER WHERE ORG_PARENT_ID=1 order by org_order)的排序结果,和最外面SELECT运行的排序结果不一致,怎么能让外面的SELECT查处来按照里面的排序显示?

重复经过,你这样是把表整个表内所有的市,县,企业全查处来了,我只要企业的信息~

"加一个 WHERE ORG_PARENT_ID=1"查询出来的全是县的信息..

xieyaoyu,你这样只能查出区县的信息,我要的是企业的...

从感觉上来说,是先执行where查询符合条件的结果集,再执行order
by,把查询出来的结果集进行排序。
此问题设计到rdbms内部实现及其查询优化的问题,你执行一条sql语句时,rdbms的sql解析器会生成相应的执行树,按照执行树的顺序对底层存储的数据操作,而后返回处理结果。这里先执行哪一个子句、后执行哪一个子句是有sql解析器决定的,sql解析器会给出一条它认为最优的执行树。
参考技术A 你自己写得句子

这样的条件啊
SELECT
ORG_ID,ORG_NAME,ORG_PARENT_ID
FROM
ORG_MASTER
WHERE
ORG_PARENT_ID
in
(SELECT
ORG_ID
FROM
ORG_MASTER
WHERE
ORG_PARENT_ID=1
ORDER
BY
ORG_ORDER)
AND
ROWNUM
<=30

要不改成
WHERE
ORG_PARENT_ID<>1
SELECT
ORG_ID,ORG_NAME,ORG_PARENT_ID
FROM
(select
*
from
ORG_MASTER
WHERE
ORG_PARENT_ID<>1
ORDER
BY
ORG_ORDER)
where
ROWNUM
<=30;
你的数据库
我也不了解
我写得这个主要是要你知道
排序的原理
参考技术B SELECT
*
FROM
(SELECT
ORG_ID,ORG_NAME,ORG_PARENT_ID
FROM
ORG_MASTER
WHERE
ORG_PARENT_ID=1
ORDER
BY
ORG_ORDER)
AND
ROWNUM
<=30;
你是想查询出县的数据排序并取前30条对吧~!
使用上述语句~!
参考技术C 你自己写得句子 是 这样的条件啊

SELECT ORG_ID,ORG_NAME,ORG_PARENT_ID FROM ORG_MASTER
WHERE ORG_PARENT_ID in (SELECT ORG_ID FROM ORG_MASTER WHERE ORG_PARENT_ID=1 ORDER BY ORG_ORDER)
AND ROWNUM <=30 ;

要不改成 WHERE ORG_PARENT_ID<>1

SELECT ORG_ID,ORG_NAME,ORG_PARENT_ID
FROM (select * from ORG_MASTER WHERE ORG_PARENT_ID<>1 ORDER BY ORG_ORDER)
where ROWNUM <=30;

你的数据库 我也不了解
我写得这个主要是要你知道 排序的原理
参考技术D 这里用order by 有点画蛇添足

oracle中group by 和order by 同时用

A表中字段id和name
我想group by name然后排序按照id来牌
select name from A group by name order by id asc
结果报错了,求解

1、首先在oracle子查询中,会经常使用到order by子句。

2、看到如下图默认情况下order by,使用的排序是升序,也就是使用的是order by 字段名asc。

3、如果要使用降序排序要使用order by  字段名  desc;方法。

4、在查询语句中order by 子句必须放在条件语句的最后,不然会报如下错误。

5、最后在对空值进行排序的时候,升序空值显示在最后,降序空值显示在最前面。

参考技术A 同时用group by 和 order by 是不可能得到你要的结果。因为order by 后面的字段必须在group by 中有而且group by 后面的字段必须在select中有。建议你不要用group by,用如下语句也能达到你要的结果:select name,id from A order by name,id 参考技术B oracle中group by 和order by 同时用
select name from A group by name ,id order by id asc order by 的栏位必须在groupby 中有
参考技术C Select name,Count(*) From a Group By id,name Order By id; 使用group by要使用聚合函数才行 参考技术D select name, min(id) id from A group by name order by id asc;

以上是关于oracle中在in子查询语句中order by排序能否用?的主要内容,如果未能解决你的问题,请参考以下文章

oracle中group by 和order by 同时用

子查询中不允许用order by子句,那么应该怎么办?

oracle子查询

oracle查询选择语句——count、sum、order by、group by

在SQL Server的子查询视图内联函数等数据库对象中,不应该单独使用ORDER BY语句

使用Union All 和Order By In View?