Oracle PL/SQL 查询顺序按 Distinct 问题

Posted

技术标签:

【中文标题】Oracle PL/SQL 查询顺序按 Distinct 问题【英文标题】:Oracle PL/SQL Query Order By issue with Distinct 【发布时间】:2008-10-28 14:21:01 【问题描述】:

有人知道这个查询有什么问题吗?

 SELECT DISTINCT c.CN as ClaimNumber, 
         a.ItemDate as BillReceivedDate, c.DTN as
 DocTrackNumber
         FROM ItemData a,
         ItemDataPage b,
         KeyGroupData c
         WHERE a.ItemTypeNum in (112, 113, 116, 172, 189)
         AND a.ItemNum = b.ItemNum
         AND b.ItemNum = c.ItemNum
         ORDER BY a.DateStored DESC;

我职业生涯的大部分时间都在做 T-Sql,这对我来说看起来是正确的,但是这个查询是针对 Oracle 数据库的,而 Toad 只是将光标放在 Order By 部分的 a.DateStored 上。我相信这对于任何使用 PL/SQL 的人来说都是基本的。

谢谢!

[EDIT] 供将来参考,SQL*Plus 给出的错误是:“ORA-01791: not a SELECTed expression”

【问题讨论】:

【参考方案1】:

您需要这样修改查询:

SELECT DISTINCT c.CN as ClaimNumber, 
         a.ItemDate as BillReceivedDate, c.DTN as
 DocTrackNumber, a.DateStored
         FROM ItemData a,
         ItemDataPage b,
         KeyGroupData c
         WHERE a.ItemTypeNum in (112, 113, 116, 172, 189)
         AND a.ItemNum = b.ItemNum
         AND b.ItemNum = c.ItemNum
         ORDER BY a.DateStored DESC;

在执行 DISTINCT 时,您的 order by 需要是选定的列之一。

【讨论】:

【参考方案2】:

没关系,在 SQL Plus 中执行给了我一个更丰富的答案。 DateStored 需要在 select 语句中,这样才有效:

    SELECT DISTINCT c.CN as ClaimNumber,          
a.ItemDate as BillReceivedDate, 
c.DTN as DocTrackNumber, 
a.DateStored         
FROM ItemData a,         
ItemDataPage b,         
KeyGroupData c         
WHERE a.ItemTypeNum in (112, 113, 116, 172, 189)         
AND a.ItemNum = b.ItemNum         
AND b.ItemNum = c.ItemNum         
ORDER BY a.DateStored DESC;

【讨论】:

如果您将此问题留在这里以供将来参考,那么我们可能应该注意到给出的错误是:ORA-01791: not a SELECTed expression【参考方案3】:

相信order by子句的元素也一定在select子句中。

【讨论】:

只是为了澄清:这是真的,因为 DISTINCT。在许多查询中,可以按不在选择列表中的列进行排序,例如从 emp ORDER BY empid 中选择名称。

以上是关于Oracle PL/SQL 查询顺序按 Distinct 问题的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 构建顺序和 PL/SQL 包依赖关系

按子句顺序排列的 PL SQL CASE

PL/SQL ORACLE 查询作为结果

关于 Oracle PL SQL 循环

Oracle PL/SQL 查询无法编译

Oracle PL/SQL:创建短路查询