Oracle中的Order By导致ORA-01791:不是SELECTed表达式

时间:2015-11-03 05:52:19

标签: sql oracle sql-order-by distinct

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

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:不是SELECTed表达式。

查询在删除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子句有什么问题?

3 个答案:

答案 0 :(得分:3)

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

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子句可能是合适的。在这种情况下,查询将正常运行。

答案 1 :(得分:1)

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并接受值的乘法。

答案 2 :(得分:0)

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