我有以下查询。执行时会抛出错误并且不执行查询。
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
子句有什么问题?
答案 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表达式。