使用order by从子查询中选择第一个元素

时间:2015-04-27 19:42:19

标签: sql oracle-sqldeveloper

我正在尝试使用子查询来挑选表的第一个元素,并对其进行一些其他过滤。

我的工作基于this answer对类似问题的评论。我的查询略有不同,因为我正在对从子查询生成的表进行一些过滤。

select *
from (
  select firstname, lastname
  from employees
  order by (lastname)
)
where
  rownum = 1
  AND lastname like :wildcard;

我的问题是:像这样的额外过滤是否有可能破坏子查询的顺序,使得这种技术在某些情况下不起作用?

这个问题有一个明显的解决方案,你可以简单地在子查询中移动lastname like :wildcard过滤器,但我正在使用的应用程序限制我这样做(我很抱歉,如果这样做这个问题比较模糊。)

编辑:

为了澄清我的应用程序限制,lastname like :wildcard过滤器不能在任何from子句子查询中。

为了尽可能地解释这个问题,应用程序在许多不同的地方使用了多个查询,并根据上下文编辑查询。有时,应用程序会将:wildcard替换为来自父查询的列引用。基于实验,这不能在from子句子查询中完成(虽然我无法找到相应的文档,我只能猜测为什么)。

2 个答案:

答案 0 :(得分:0)

我不明白为什么你无法改变内部子查询,但如果你真的不能,你可能需要做这样的多个子查询:

select *
from (
  select *
  from (
    select firstname, lastname
    from employees
    order by (lastname)
  )
  where lastname like :wildcard
)
where rownum = 1;

您编写的方式,只有在按字母顺序查询姓氏时,才能获得正确的结果。如果您查询类似" Smith"的内容,则会返回0行。

答案 1 :(得分:0)

我想不出任何问题。您还可以使用以下语句,这使其更加清晰:

select *
  from (select *
        from (select firstname, lastname
                from (select 'Tim' firstname,'Barton' lastname from dual union 
                      select 'Tom' firstname,'Benton' lastname from dual union
                      select 'Jim' firstname,'Teresi' lastname from dual union
                      select 'Sam' firstname, 'Smith' lastname from dual)
               order by (lastname))
        where lastname like 'Be%')
  where rownum = 1;

检查this demo