2012-11-26 84 views
0
select * from (select * from y where x="t") where z rlike "(.*)query1" 
union 
select * from (select * from y where x="t") where z rlike "(.*)query2" 

正如您在上面看到的,圓括號包含相同的查詢,通常 返回多行結果。有沒有什麼辦法通過只查詢一次括號內的select語句並反覆使用結果來優化它?SQL - 重複相同的查詢塊

PS:我想以有序的方式獲得結果,所以第一個聯合查詢的結果必須保持在最前。

+0

你是什麼意思的'有序的方式'?當z以「query1」結尾時,你必須有情況嗎? – Benoit

+0

@Benoit假設'(query1)union(query2);'query1返回row1,而query2返回row0。我想要這個命令:row1,row0。 –

回答

3

三樣東西在這裏:

  • 首先,避免UNION如果你可以使用UNION ALL。 Plain union s涉及刪除重複項,因此需要更多時間。
  • 如果您可以對查詢進行因子分解,請執行此操作。在這裏,除了一個標準外,您可以使用精確查詢的聯合,那麼您可以使用OR
  • select * from (select * ...是冗餘,可以避免。

其中給出:

SELECT * 
    FROM y 
WHERE x = 't' 
    AND (z RLIKE '(.*)query1' 
     OR 
     z RLIKE '(.*)query2' 
     ) 

如墨爾波墨涅的評論說,你可以在正則表達式的水平甚至因子(謝謝!):
WHERE z RLIKE '(.*)query1|(.*)query2'

如果有y重複和你不想要它們,因爲UNION丟棄了它們,你可以引入DISTINCT,但是如果沒有必要的話可以避免。

如果您想訂購,請不要依賴DBMS。使用ORDER BY

ORDER BY CASE WHEN z RLIKE '(.*)query1' THEN 1 
       WHEN z RLIKE '(.*)query2' THEN 2 
       ELSE 3 -- given the WHERE clause, should never happen 
     END 
+1

如果這是一個正則表達式,您甚至可以執行'z RLIKE'(。*)query1 |(。*)query2''。 – melpomene

+0

@melpomene:對,有可能。 – Benoit

+0

也許值得指出的是,有些情況下UNION導致比OR更好的查詢計劃。但是,如果選擇了一個非常糟糕的計劃,最好從OR開始,只切換到UNION。 – FoolishSeth