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 问题的主要内容,如果未能解决你的问题,请参考以下文章