我想在最外面的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。
还有其他缺点,当我使用第二个选项时,有大量数据并希望我的查询表现良好吗?
答案 0 :(得分:0)
SELECT a.FirstName,
a.LastName,
b.ComplexColumn
FROM Table a,
(SELECT ComplexStuff ComplexColumn FROM ComplexTables) b
WHERE b.ComplexColumn LIKE '%Foobar%'