2011-09-22 3 views
0

다음 문제 :SQL 쿼리 : 쿼리 이전 쿼리에 따라 및 병합 결과

쿼리 2와 쿼리 3 쿼리 한 결과에 따라 당신이이 쿼리를 표현하는 것이 어떻게 쿼리 4 쿼리 2의 결과에 따라 달라집니다 동일한 쿼리를 여러 번 실행하지 않고도?

예 :

쿼리 1

SELECT id, color, part FROM T1 

쿼리 2

SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1) 

조회 3

(210)

끝에 쿼리 ​​4

SELECT id from T4 where T4.owner in (SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1)) 

편집

난 당신이 볼 수 있듯이, 나는 복사하여 붙여 넣은

Query1 union Query2 union Query3 union Query4 

이제 결과의 조합을 필요로 이전 쿼리에는이 작업을 수행하는 더 좋은 방법이 있어야합니다.

+1

노동 조합 각 쿼리의 결과 – Randy

+0

의 JOIN 구문을 사용할 수 있습니다 – user944308

+2

참고 ** 각 결과 집합에 ** 다른 필드를 사용하기 때문에 당신의 노동 조합의 결과는 불가능합니다 ** – JNK

답변

0

정말로 네 가지 결과 집합이 필요합니까? T1과 T2, T3, T4는 각각의 집합에서 얼마나 많은 행을 기대합니까? 그리고 어떤 종류의 엔티티가 그러한 집합을 단일 집합으로 결합 할 수 있기 때문에 가능합니다. 또한

이 :

SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1) 

가 유효한 SQL하지 않습니다, 당신은 아마 의미 :

SELECT id, owner FROM T2 WHERE T2.color in (SELECT color FROM T1) 
죄송합니다 아, 내가이 사실을 왼쪽 대신 IN
+0

죄송합니다 SQL에 대한 실수 ... 나는 단지 간단한 예제를 생각하고 싶었어요. 함께 일하면서 더 복잡해집니다. 예, 그들은 모두 같은 엔티티를 가지고 있지만 원본 테이블의 서브 세트입니다. – user944308

+0

@ user944308 서브 세트가 뷰로 정의되어 있습니까? T2가 T1과 어떤 관련이 있는지 명확하지 않기 때문에 어렵습니다. 문제를 평범한 영어로 쓰면 훨씬 쉽습니다. MySQL은 아직 공통 테이블 식/하위 쿼리 인수 분해를 지원하지 않으므로 아마도 하위 쿼리를 반복해야 할 것입니다. 그러나 그것은 반드시 나쁜 것은 아닙니다. 1) 각각의 경우에 개별적으로 연산을 개별적으로 최적화하거나 2) 옵티마이 저가이를 개별적으로 조합 할 수 있기 때문입니다. 우선 코드 품질과 유지 보수성에 대해 걱정할 것입니다. 다음은 성능입니다 (실행 계획에서 문제의 증거를 본 후). –

+1

@ user944308, 누군가가 이렇게 단순하게 만들 때마다 복잡성이 문제의 일부이기 때문에 잘못된 대답을 얻습니다. 앞으로는하지 마세요. – HLGEM

1

특정 열을 기준으로 결합하면됩니다.

select * from T1 
inner join T2 on T1.color=T2.color 
inner join T3 on T3.part=T1.part 
inner join T4 on T4.owner=T2.owner