我试图使用子查询来选择表的第一个元素,并对其进行其他过滤。
我的工作是基于对这个答案的一个类似问题的评论。我的查询略有不同,因为我正在对从子查询生成的表进行一些筛选。
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子句子查询中不能这样做(尽管我无法找到这方面的文档,我只能猜测原因)。
发布于 2015-04-27 20:53:05
我想不出任何问题。您还可以使用以下语句,这使它更加清晰:
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;检查这个演示。
发布于 2015-04-27 20:43:53
我不明白为什么您无法更改内部子查询,但如果真的不能更改,则可能需要执行以下多个子查询:
select *
from (
select *
from (
select firstname, lastname
from employees
order by (lastname)
)
where lastname like :wildcard
)
where rownum = 1;按照您编写的方式,只有在按字母顺序查询姓氏时,才能得到正确的结果。如果查询类似"Smith“的内容,将返回0行。
https://stackoverflow.com/questions/29904541
复制相似问题