2012-03-20 22 views
3

如果某個子查詢將作爲子查詢再次使用,是否可以以某種方式存儲mysql子查詢?據推測這會產生更乾淨的代碼以及節省解析開銷。將mysql子查詢存儲在變量中

例如在下面的外部聯接

SELECT * FROM t1 
LEFT JOIN (SELECT * FROM t2 WHERE t2.foo=='bar') ON t1.id = t2.id 
UNION 
SELECT * FROM t1 
RIGHT JOIN (SELECT * FROM t2 WHERE t2.foo=='bar') ON t1.id = t2.id 

這將是很好不要重複(SELECT * FROM t2 WHERE t2.foo=='bar')

+2

你可以使用'ON t1.id = t2.id和t2.foo ='bar''而不是'(SELECT * FROM t2 WHERE t2.foo =='bar')'。 P.S只在mysql中有一個'=' – safarov 2012-03-20 11:01:18

+0

您也可以使用視圖 – haltabush 2012-03-20 11:02:21

回答

2

當然不喜歡這樣

SET @condition := (SELECT * FROM t2 WHERE t2.foo=='bar'); 
SELECT * FROM t1 
LEFT JOIN (@condition) ON t1.id = t2.id 
UNION 
SELECT * FROM t1 
RIGHT JOIN (@condition) ON t1.id = t2.id 
+0

糾正我,如果我錯了,我不認爲這是行得通的。 – Roylee 2017-02-08 06:39:05

3

不,你不能。如果MySQL不得不CTE(公共表表達式),你可以這樣做:

WITH tmp AS 
    (SELECT * FROM t2 WHERE t2.foo = 'bar') 
SELECT * FROM t1 
    LEFT JOIN tmp ON t1.id = tmp.id 
UNION 
SELECT * FROM t1 
    RIGHT JOIN tmp ON t1.id = tmp.id 

如果MySQL有FULL JOIN,你可以使用這個(唉,它也不該!):

SELECT * FROM t1 
    FULL JOIN (SELECT * FROM t2 WHERE t2.foo = 'bar') tmp 
    ON t1.id = tmp.id 
相關問題