2011-08-25 2 views
12
SELECT * FROM A 
JOIN B 
ON B.ID = A.ID 
AND B.Time = (SELECT max(Time) 
          FROM B B2 
          WHERE B2.ID = B.ID) 

MYSQL에서이 두 테이블을 조인하려고합니다. ID가 고유하다면이 일을하려고하지 않을 것입니다. 단순화 된 그림을 그리기 위해 실제 솔루션을 응축했습니다. 특정 레코드의 최대 날짜에 테이블 B를 잡고 결합하려고합니다. 이 절차는 SSIS 패키지에 의해 실행되며 B2.ID는 알 수없는 열입니다. 나는 이런 일을 MSSQL에서 자주하고 MYSQL에 익숙하지 않다. 누구든지 어떤 지침이나 아이디어가 있습니까?MYSQL에서 중첩 된 Select 문이 연결됩니다.

답변

27

이 쿼리 유형은 하위 쿼리 대신 제외 연결과 다르게 수행합니다. 주어진 ID에 대해 최대 시간을 가진 B의 행을 찾고 싶습니다. 즉, 다른 행에 시간이 더 길고 ID가 동일한 행이없는 경우입니다.

SELECT A.*, B.* 
FROM A JOIN B ON B.ID = A.ID 
LEFT OUTER JOIN B AS B2 ON B.ID = B2.ID AND B.Time < B2.Time 
WHERE B2.ID IS NULL 

는 또한 상관 하위 쿼리를 사용하는 것보다 더 잘 수행해야 파생 테이블를 사용할 수 있습니다.

SELECT A.*, B.* 
FROM A JOIN B ON B.ID = A.ID 
JOIN (SELECT ID, MAX(Time) AS Time FROM B GROUP BY ID) AS B2 
    ON (B.ID, B.Time) = (B2.ID, B2.Time) 

피씨 : greatest-n-per-group 태그를 추가했습니다. 이 유형의 SQL 질문은 매주 Stack Overflow에서 발생하므로 해당 태그를 따라 수십 개의 비슷한 질문과 대답을 볼 수 있습니다.

+2

위대한 답변! +1 – shesek

+0

잘 고맙습니다. – JBone

관련 문제