Oracle在查询Sql中不使用order by,导致数据量足够大的时候同样的sql查询的结果顺序不同?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle在查询Sql中不使用order by,导致数据量足够大的时候同样的sql查询的结果顺序不同?相关的知识,希望对你有一定的参考价值。
如题,导致的问题是分页功能有问题,有的数据重复显示,有的数据怎么也查询不到。 因为是基础框架的修改,为了不影响现有的功能,希望在不加order by的情况下解决这个问题,不知道有没有什么好的办法
参考技术A oracle是按照rowid来排序的,也就是每一行的地址,当中间发生一些数据操作,比如删除数据时,这个物理地址会被新数据使用,oracle的数据在存的时候也是杂乱无序的,可以通过创建索引,根据索引查询解决问题 参考技术B 加一列rownum(oracle自带),然后按照分页取数字就是了。我不知道你的具体分页方式,只能给一个通用的方法。
oracle查询选择语句——count、sum、order by、group by
【中文标题】oracle查询选择语句——count、sum、order by、group by【英文标题】:Oracle query select statement - count, sum, order by, group by 【发布时间】:2016-02-17 03:12:07 【问题描述】:我正在尝试一个我什至无法理解的 Oracle SQL 家庭作业...有人可以帮帮我吗?我在 SQL 方面不是一个完全的菜鸟,但这似乎太复杂了,我无法理解。
提示是: 编写一个 SELECT 语句,为每个包含三列的总帐帐号返回一行: General_Ledger_accounts 表中的 account_description 列 Invoice_Line_Items 表中具有相同 account_number 的条目的计数 Invoice_Line_Items 表中具有相同 account_number 的行项目金额的总和 过滤结果集以仅包含计数大于 1 的那些行;按帐户描述对结果集进行分组(我假设它们的意思是 Account_Description);并按订单项金额之和对结果集进行降序排序。
表格详情:
SQL> desc general_ledger_accounts
Name Null? Type
----------------------------------------- -------- ----------------------------
ACCOUNT_NUMBER NOT NULL NUMBER
ACCOUNT_DESCRIPTION NOT NULL VARCHAR2(50)
【问题讨论】:
您能告诉我们您尝试的查询无效吗? 其实我还没有开始,因为我不知道从哪里开始。我确实问过提供这个的同学,但它在 count(distinct invoice_line_items.account_number) 列中返回值 61482。 select general_ledger_accounts.account_description, count(DISTINCT invoice_line_items.account_number), sum(invoice_line_items.account_number) from general_ledger_accounts, invoice_line_items group by general_ledger_accounts.account_description HAVING count(DISTINCT invoice_line_items.account_number) > 1 order by count(DISTINCT invoice_line_items.account_number) desc; 【参考方案1】:首先,在您的FROM
子句中,您需要使用GENERAL_LEDGER_ACCOUNTS.ACCOUNT_NUMBER = INVOICE_LINE_ITEMS.ACCOUNT_NUMBER
的条件将GENERAL_LEDGER_ACCOUNTS
表与INVOICE_LINE_ITEMS
表连接起来。
然后(在此之上),在您的 SELECT
子句中,指明您需要的 3 列。
您不需要WHERE
子句,因为您正在考虑所有行。
使用GROUP BY
子句指示您要聚合的列。由于您想要每个 ACCOUNT_NUMBER
的聚合(COUNT
和 SUM
),那么您只需要 ACCOUNT_NUMBER
在您的 GROUP BY
中。
接下来,使用HAVING
过滤组。在您的情况下,您希望将HAVING
和COUNT
分组到某个阈值以上。
最后,使用ORDER BY
按照SUM
在DESC
结束顺序中对组进行排序。
* 剧透:先尝试自己解决*
SELECT gla.account_description, count(*), sum(ili.line_item_amount)
FROM general_ledger_accounts gla
INNER JOIN invoice_line_items ili ON ili.account_number = gla.account_number
GROUP BY gla.account_description
HAVING count(*) > 1
ORDER BY SUM(ili.line_item_amount) DESC
【讨论】:
谢谢!只是几个问题,既然我们说“FROM gla”,“count(*)”怎么知道只计算来自 ili 的条目? 'inner join' 和 'join' 和有什么不一样?两者似乎都以相同的方式工作。也许我应该接受提示,一次只做一份。我只是被它淹没了。COUNT(*)
计算每个组中的记录总数。我假设ACCOUNT_NUMBER
是GENERAL_LEDGER_ACCOUNTS
中的主键。因此,GENERAL_LEDGER_ACCOUNTS
中只能有 1 个帐户,ACCOUNT_NUMBER
,例如 1234。假设有 6 个 ili
行具有相同的帐号。然后,gla
和 ili
之间的连接将产生 6 行,帐号为 1234。如果有可能,例如,gla
中有 2 个帐号,帐号为 1234,那么连接将产生 2x6 = 12 行(我的查询不正确)。但这就是为什么你总是有一个......
一个表中的外键转到另一个表中的唯一键(希望是主键)...以避免这种 2x6 类型的情况(称为叉积的笛卡尔积)。跨度>
JOIN
和 INNER JOIN
之间没有区别。默认情况下,JOIN
是 INNER JOIN
,这与 OUTER JOIN
不同,您稍后肯定会了解。
马修,我感激不尽。这很清楚,我实际上理解它。以上是关于Oracle在查询Sql中不使用order by,导致数据量足够大的时候同样的sql查询的结果顺序不同?的主要内容,如果未能解决你的问题,请参考以下文章
oracle中在in子查询语句中order by排序能否用?
SQL(ORACLE):ORDER BY 和 LIMIT [重复]
1. 安装Oracle,配置环境 2. 实现查询From子句 3. 实现查询where子句 4. 实现查询order by子句