我在SQL Developer中测试了一个关于 "Subquery in Order By "的案例。

问题描述 投票:0回答:3

我有一个关于 "子查询按子句排序 "的问题。下面的请求返回错误。这是否意味着子查询中的子句必须是标量?

select * 
from employees
order by (select * from employees where first_name ='Steven' and last_name='King');

错误:ORA-00913:太多的值

ORA-00913: 太多值 00913. 00000 - "太多值"

oracle subquery sql-order-by
3个回答
1
投票

是的,这意味着如果你使用子查询在 ORDER BY 它必须是标量。

有了 select * 你的子查询返回多个列,而DBMS将不知道使用其中的哪一列进行排序。而如果你只选择了一列,当然还是要保证只选择一行。(不同的是,Oracle会立即看到太多列的问题,但只有在获取数据时才会检测到太多行)。

这样就可以了。

select * from employees
order by (select birthdate from employees where employee_id = 12345);

这是一个标量查询,因为它只返回一个值(一列,一行)。但当然这和你原来的查询一样,还是没有什么意义,因为子查询的结果是独立于主查询的,也就是说,它对表中的每一行都返回相同的值,因此没有排序的效果。

最后说一下。一个子查询在 ORDER BY 很少有意义,因为这意味着你会用一些你不显示的东西来排序。例外的情况是在查找排序键的时候。比如说

select *
from products p
where type = 'shirt' and color = 'blue' and size in ('S', 'M', 'L', 'XL')
order by (select sortkey from sizes s where s.size = p.size);

1
投票

这意味着 有效选项 对于 ORDER BY 可以

  • 表达方式:
  • 位置或
  • 列别名

子查询既不是这些,也不是这些。

© www.soinside.com 2019 - 2024. All rights reserved.