0
我想在我最外面的WHERE
-clause中解決一些相當複雜的子查詢。我意識到我不能通過其名稱引用別名列,因爲SELECT
-clause被評估爲WHERE
-clause。Oracle:在WHERE子句中引用別名子查詢
因此這將不工作:
SELECT FirstName,
LastName,
(SELECT ComplexStuff FROM ComplexTables) ComplexColumn
FROM Table
WHERE ComplexColumn LIKE '%Foobar%';
我也清楚的替代品,namels重複子查詢中WHERE
-clause或包裹我的整個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執行計劃可以爲您提供一些有關兩種查詢性能的有用信息。 – Multisync 2014-11-25 13:58:24
這是一個呼籲,你必須記住複雜材料查詢中的表格大小和索引選項。如果表格尺寸太大,使用選項1是很好的,它會限制選擇所有數據。同樣,如果表中的數據數量有限,或者分區表中具有適當的索引,選項2會更好。 – Shankar 2014-11-25 14:04:22