Select 来自排序依据的子查询的第一个元素

Select first element from subquery with order by

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

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

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 子句子查询中完成(尽管我无法找到这方面的文档,我只能猜测原因)。

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

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

按照您的书写方式,只有在查询按字母顺序排在第一位的姓氏时,您才会得到正确的结果。如果您查询类似 "Smith" 的内容,您将返回 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