2012-03-20 5 views
3

mysql 하위 쿼리를 다시 하위 쿼리로 사용하는 경우 저장하는 것이 가능합니까? 아마도 이것은 구문 분석 오버 헤드를 줄이고 깨끗한 코드를 생성합니다. 다음 외부에서변수에 mysql 하위 쿼리를 저장

예를 들어

(SELECT * FROM t2 WHERE t2.foo=='bar')를 반복하지 좋을 것이다

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 

가입 할 수 있습니다. 물론

+2

에게 당신을 '(SELECT * FROM t2 WHERE t2.foo == 'bar')'대신에'ON t1.id = t2.id와 t2.foo = 'bar''를 사용할 수 있습니다. P.S mysql에서 단 하나의'= '만 사용 – safarov

+0

보기를 사용할 수도 있습니다 – haltabush

답변

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

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 
관련 문제