我想在我的最外层的WHERE-clause中处理一些相当复杂的子查询。我知道这样一个事实,即我不能引用别名列的名称,因为SELECT-clause是在 WHERE-clause之后计算的。
因此,这将使不适用于:
SELECT FirstName,
LastName,
(SELECT ComplexStuff FROM ComplexTables) ComplexColumn
FROM Table
WHERE ComplexColumn LIKE '%Foobar%';我还知道替代方案,在WHERE-clause中重复子查询或包装整个SELECT-statement。
备选案文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-clause,否则不会对它们进行筛选。我是否需要担心这一点,还是数据库优化器能够尽可能地将谓词向下推到内部查询中?我是甲骨文的,如果这有关系的话。
当我使用第二个选项时,是否还有其他的缺点,有大量的数据,并且希望我的查询执行得很好?
发布于 2014-11-25 14:28:36
SELECT a.FirstName,
a.LastName,
b.ComplexColumn
FROM Table a,
(SELECT ComplexStuff ComplexColumn FROM ComplexTables) b
WHERE b.ComplexColumn LIKE '%Foobar%'https://stackoverflow.com/questions/27127988
复制相似问题