【问题标题】:Order By in Oracle cause ORA-01791: not a SELECTed expressionOracle 中的 Order By 导致 ORA-01791:不是 SELECTed 表达式
【发布时间】:2015-11-03 05:52:19
【问题描述】:

我有以下查询。执行时会抛出错误,并且不会执行查询。

SELECT DISTINCT svc.column1 ,
  svc.column2 ,
  svc.column3 ,
  svc.column4 ,
  svc.column5 ,
  svc.column6 ,
  svc.column7 ,
  svc.column8 ,
  svc.column9 ,
  svc.column10 ,
  svc.column11 ,
  svc.column12
FROM shemaName.tableName svc
WHERE svc.column13 IS NOT NULL
AND svc.column14    = 'DEEPAK'
AND svc.column15    = '188888'
AND ROWNUM         <=10
AND column16        = 'N'
ORDER BY svc.column13;

我得到的错误是

java.sql.SQLSyntaxErrorException: ORA-01791: not a SELECTed expression.

删除order by子句后查询返回结果,如下:

SELECT DISTINCT svc.column1 ,
  svc.column2 ,
  svc.column3 ,
  svc.column4 ,
  svc.column5 ,
  svc.column6 ,
  svc.column7 ,
  svc.column8 ,
  svc.column9 ,
  svc.column10 ,
  svc.column11 ,
  svc.column12
FROM shemaName.tableName svc
WHERE svc.column13 IS NOT NULL
AND svc.column14    = 'DEEPAK'
AND svc.column15    = '188888'
AND ROWNUM         <=10
AND column16        = 'N';

添加order by子句有什么问题?

【问题讨论】:

标签: sql oracle sql-order-by distinct


【解决方案1】:

引擎无法处理您的查询,因为它违反了逻辑。我会给你一个更简单的例子来更容易理解这个案例:

Table
colA  colB
1     10
1     30
2     20
2     20

所以:

 select distinct colA from table;

1
2

select colA from table order by colb;

1
2
2
1

但是,select distinct colA from table order by colb; 应该给什么?值 1 应该同时是第一个和最后一个。这是一个不可能的问题。

PS:在您的情况下,将 column13 添加到 select distinct 子句中可能是合适的。在这种情况下,查询将运行良好。

【讨论】:

    【解决方案2】:

    DISTINCT 过滤掉第 1-12 列的重复值。因此结果集与表中的行不匹配 1:1。

    现在您的 ORDER BY 子句要求数据库使用不在结果集中的列对结果集进行排序。但是对于第 1-12 列的每个组合,可能有多个 column13 值。数据库不 - 不能 - 知道使用哪一个,所以它抛出 ORA-01791。

    至于解决方案,您需要一种方法将column13 公开给数据库,而不将其包含在最终投影中。因此,您可能需要使用某种内联方式。采取哪种方法取决于您的数据。

    如果column13 对于第 1-12 列的每个组合只有一个值,那么您可以使用这样的内联视图:

    SELECT q.column1 ,
      q.column2 ,
      q.column3 ,
      q.column4 ,
      q.column5 ,
      q.column6 ,
      q.column7 ,
      q.column8 ,
      q.column9 ,
      q.column10 ,
      q.column11 ,
      q.column12
    FROM ( SELECT DISTINCT svc.column1 ,
                  svc.column2 ,
                  svc.column3 ,
                  svc.column4 ,
                  svc.column5 ,
                  svc.column6 ,
                  svc.column7 ,
                  svc.column8 ,
                  svc.column9 ,
                  svc.column10 ,
                  svc.column11 ,
                  svc.column12 ,
                  svc.column13
            FROM shemaName.tableName svc
            WHERE svc.column13 IS NOT NULL
            AND svc.column14    = 'DEEPAK'
            AND svc.column15    = '188888'
            AND ROWNUM         <=10
            AND column16        = 'N' 
          ) q
    order by q.column13;
    

    如果column13 个值,请选择一些限制条件并在内联视图中聚合。这个选择column13的最小值:

    SELECT q.column1 ,
      q.column2 ,
      q.column3 ,
      q.column4 ,
      q.column5 ,
      q.column6 ,
      q.column7 ,
      q.column8 ,
      q.column9 ,
      q.column10 ,
      q.column11 ,
      q.column12
    FROM ( SELECT svc.column1 ,
                  svc.column2 ,
                  svc.column3 ,
                  svc.column4 ,
                  svc.column5 ,
                  svc.column6 ,
                  svc.column7 ,
                  svc.column8 ,
                  svc.column9 ,
                  svc.column10 ,
                  svc.column11 ,
                  svc.column12 ,
                  min(svc.column13) as column13
            FROM shemaName.tableName svc
            WHERE svc.column13 IS NOT NULL
            AND svc.column14    = 'DEEPAK'
            AND svc.column15    = '188888'
            AND ROWNUM         <=10
            AND column16        = 'N' 
            group by svc.column1 ,
                      svc.column2 ,
                      svc.column3 ,
                      svc.column4 ,
                      svc.column5 ,
                      svc.column6 ,
                      svc.column7 ,
                      svc.column8 ,
                      svc.column9 ,
                      svc.column10 ,
                      svc.column11 ,
                      svc.column12 
          ) q
    order by q.column13;
    

    或者,只需在 DISTINCT 投影中包含 column13 并接受值的乘积。

    【讨论】:

    • 谢谢..了解问题
    【解决方案3】:

    您犯的一个简单错误是,svc.column13 列未在 DISTINCT COLUMNS 中定义。因此,引擎没有将语句视为 SELECT 表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多