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

Oracle:在WHERE子句中引用别名子查询,oracle,nested,subquery,alias,where-clause,Oracle,Nested,Subquery,Alias,Where Clause,我想在最外层的WHERE-子句中处理一些相当复杂的子查询。我知道我不能用别名来引用别名列,因为SELECT-子句是在WHERE-子句之后计算的 因此,这将不起作用: 我也知道一些替代方法,名称在WHERE-子句中重复子查询,或者包装我的整个SELECT-语句 备选案文1: 备选案文2: 第一个解决方案不是很容易维护,因为我必须重复每个子查询,这是一个坏习惯,特别是如果子查询非常复杂的话 我的问题是:就性能而言,第二种解决方案的效率如何?如果我没有弄错的话,包装查询将始终返回所有条目,除非应用了最

我想在最外层的
WHERE
-子句中处理一些相当复杂的子查询。我知道我不能用别名来引用别名列,因为
SELECT
-子句是在
WHERE
-子句之后计算的

因此,这将不起作用:

我也知道一些替代方法,名称在
WHERE
-子句中重复子查询,或者包装我的整个
SELECT
-语句

备选案文1:

备选案文2:

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

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


当我使用第二个选项时,有很多数据并且希望我的查询执行良好,是否还有其他缺点?

Oracle执行计划可以为您提供有关两个查询性能的有用信息。您必须记住complexstuff查询上的表大小和索引选项。如果表的大小太大,那么最好使用选项1,因为它限制了所有数据的选择。同样,如果表中的数据数量有限,或者具有适当索引的分区表,则选项2更好。
SELECT a.FirstName,
   a.LastName,
   b.ComplexColumn
FROM Table a,
    (SELECT ComplexStuff ComplexColumn FROM ComplexTables) b
WHERE b.ComplexColumn LIKE '%Foobar%'
SELECT FirstName,
       LastName,
       (SELECT ComplexStuff FROM ComplexTables) ComplexColumn
FROM Table
WHERE (SELECT ComplexStuff FROM ComplexTables) LIKE '%Foobar%';
SELECT * FROM
  (SELECT FirstName,
          LastName,
          (SELECT ComplexStuff FROM ComplexTables) ComplexColumn
  FROM Table)
WHERE ComplexColumn LIKE '%Foobar%';
SELECT a.FirstName,
   a.LastName,
   b.ComplexColumn
FROM Table a,
    (SELECT ComplexStuff ComplexColumn FROM ComplexTables) b
WHERE b.ComplexColumn LIKE '%Foobar%'