2012-09-08 3 views
0

쿼리가 거의 중복되지 않도록이 UNION을 단순화 할 수 있습니까? 위의 두 쿼리는 비슷합니다. 테이블 2의 다른 열에 조인하면됩니다. 동일한 쿼리에서 내부 조인 2x 대신 Union을 사용하는 이유는이 쿼리가 하위 쿼리로 사용된다는 사실 때문에 결과가 1 열에 있어야하기 때문입니다.이 SQL UNION 쿼리를 단순화 할 수 있습니까?

SELECT t1.id as id 
FROM table1 g 
INNER JOIN table2 t1 on g.t_id = t1.id 
WHERE g.id=1 
UNION 
SELECT t2.id as id2 
FROM table1 g 
INNER JOIN table2 t2 on g.t2_id = t2.id 
WHERE g.id=1 
+1

이것은 이전 질문과 매우 유사합니다. 다른 무엇입니까? – Kermit

+0

차이점은 where 절이 여기에서 동일하다는 것입니다. 내부 조인은 다릅니다. 두 가지 질문에 동일한 대답이 적용되지 않습니다. – glutz

답변

2

두 술어 중 하나에서 일치시킬 수있는 간단한 내부 조인으로 처리 할 수없는 이유가 없습니다. 명확성을 위해 t1, t2 및 g의 원본 ​​테이블 별칭을 제거했습니다. 쿼리가 중복 행을 생성 할 수 있는지 알지 못하기 때문에 DISTINCT를 사용하여 원래 쿼리에서 UNION이 수행 한 것과 같은 방식으로 중복 행을 축소했습니다.

SELECT DISTINCT table2.id 
FROM table1 
INNER JOIN table2 
ON (table1.t_id = table2.id OR table1.t2_id = table2.id) 
WHERE table1.id = 1 
; 
+0

에 해당하지 않습니다. 감사! – glutz

1

이 두 조인과 함께 할 수 및 IFNULL() 함수 :

select distinct t.id 
from table2 t 
where t.id in (select g.t_id from table1 g) or 
     t.id in (select g.t2_id from table1 g) 

그러나, 성능이 끔찍한 될 것이다 :

SELECT IFNULL (t1.id, t2.id) as id 
FROM table1 g 
INNER JOIN table2 t1 on g.t_id = t1.id 
INNER JOIN table2 t2 on g.t2_id = t2.id 
WHERE g.id=1 
+0

이 쿼리는 결과 집합에 나타 내기 위해 두 조인 모두 성공해야하므로이 쿼리는 원래 쿼리와 동일한 결과를 생성하지 않습니다. 조인 조건이 만족되면 원래 쿼리는 행을 생성합니다. –

1

당신이 간단 찾을 수 있습니다 MySQL에. 다음과 같이 할 수도 있습니다 :

select distinct t.id 
from table2 t 
where exists (select 1 from table1 g where g.t_id = t.id or g.t2_id = t.id) 

두 번째 버전은 MySQL에서 더 잘 작동합니다.

+0

g.id = 1 – glutz

관련 문제