2014-11-25 79 views
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條款,否則它們將不會被過濾。我是否必須擔心這個問題呢,還是數據庫優化器能夠儘可能地將謂詞壓入內部查詢?我在甲骨文,如果這是相關的。

當我使用第二個選項時,有沒有其他缺點,有很多數據,並希望我的查詢表現良好?

+0

Oracle執行計劃可以爲您提供一些有關兩種查詢性能的有用信息。 – Multisync 2014-11-25 13:58:24

+0

這是一個呼籲,你必須記住複雜材料查詢中的表格大小和索引選項。如果表格尺寸太大,使用選項1是很好的,它會限制選擇所有數據。同樣,如果表中的數據數量有限,或者分區表中具有​​適當的索引,選項2會更好。 – Shankar 2014-11-25 14:04:22

回答

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