代码之家  ›  专栏  ›  技术社区  ›  Chris Conway

Oracle pl/sql按问题的查询顺序,带distinct

  •  7
  • Chris Conway  · 技术社区  · 16 年前

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

     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.date上。我相信这对于任何做PL/SQL的人来说都是基本的。

    谢谢!

    [编辑]以后参考,sql*plus给出的错误是:“ora-01791:不是所选表达式”

    3 回复  |  直到 11 年前
        1
  •  15
  •   Brian Schmitt    16 年前

    您需要修改查询,如下所示:

    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
  •  2
  •   Chris Conway    16 年前

    但是,在SQL Plus中执行给了我一个更有用的答案。所存储的日期需要在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;
    
        3
  •  2
  •   Severin    16 年前

    我相信ORDERBY子句的元素也必须在SELECT子句中。