Oracle:在WHERE子句中引用别名子查询

时间:2014-11-25 13:25:04

标签: oracle nested subquery alias where-clause

我想在最外面的WHERE - 子句中解决一些相当复杂的子查询。我知道我不能引用别名列的名称,因为SELECT - 子句在<{strong> WHERE后评估 -clause。

所以这将工作:

SELECT FirstName,
       LastName,
       (SELECT ComplexStuff FROM ComplexTables) ComplexColumn
FROM Table
WHERE ComplexColumn LIKE '%Foobar%';

我也知道替代方案,名字在WHERE - 子句中重复子查询或包装我的整个SELECT语句。

选项1

SELECT FirstName,
       LastName,
       (SELECT ComplexStuff FROM ComplexTables) ComplexColumn
FROM Table
WHERE (SELECT ComplexStuff FROM ComplexTables) LIKE '%Foobar%';

选项2:

SELECT * FROM
  (SELECT FirstName,
          LastName,
          (SELECT ComplexStuff FROM ComplexTables) ComplexColumn
  FROM Table)
WHERE ComplexColumn LIKE '%Foobar%';

第一个解决方案不是很容易维护,因为我必须重复每个子查询,这是一个坏习惯,特别是如果子查询非常复杂。

我的问题是:第二种解决方案在性能方面的效率如何?如果我没有弄错,包装的查询将始终返回所有条目,除非应用了最外面的WHERE - 子句,否则不会过滤它们。我是否必须担心这一点,或者数据库优化器是否设法尽可能地将谓词推入内部查询?如果这是相关的,那我就是Oracle。

还有其他缺点,当我使用第二个选项时,有大量数据并希望我的查询表现良好吗?

1 个答案:

答案 0 :(得分:0)

SELECT a.FirstName,
   a.LastName,
   b.ComplexColumn
FROM Table a,
    (SELECT ComplexStuff ComplexColumn FROM ComplexTables) b
WHERE b.ComplexColumn LIKE '%Foobar%'