2017-10-24 7 views
0

나는 다음과 같은 두 개의 테이블이 있습니다결합 조회에서 MAX 값을 찾기

표 #USER

SELECT * 
INTO #USER 
FROM (
    SELECT 'A.2017.JAN' AS [KSCEN], 'John' AS [Name], 'Doe' AS [Surname] UNION ALL 
    SELECT 'A.2017.JAN' AS [KSCEN], 'Paul' AS [Name], 'Red' AS [Surname] UNION ALL 
    SELECT 'A.2017.FEB' AS [KSCEN], 'John' AS [Name], 'Doe' AS [Surname] UNION ALL 
    SELECT 'A.2017.FEB' AS [KSCEN], 'Paul' AS [Name], 'Red' AS [Surname] UNION ALL 
    SELECT 'A.2017.MAR' AS [KSCEN], 'John' AS [Name], 'Doe' AS [Surname] UNION ALL 
    SELECT 'A.2017.MAR' AS [KSCEN], 'Paul' AS [Name], 'Red' AS [Surname] UNION ALL 
    SELECT 'A.2017.MAR' AS [KSCEN], 'Kate' AS [Name], 'Blue' AS [Surname] 
) A 

표 내 목표는 찾을 수 있습니다 #KSCEN

SELECT * 
INTO #KSCEN 
FROM (
    SELECT 'A.2017.JAN' AS [ID], 6 AS [SEQ] UNION ALL 
    SELECT 'A.2017.FEB' AS [ID], 7 AS [SEQ] UNION ALL 
    SELECT 'A.2017.MAR' AS [ID], 8 AS [SEQ] UNION ALL 
    SELECT 'A.2017.APR' AS [ID], 9 AS [SEQ] UNION ALL 
    SELECT 'A.2017.MAY' AS [ID], 10 AS [SEQ] 
) A 

테이블 #USER 내에서 적어도 한 번 이상 사용 된 MAX SEQ가있는 #KSCEN의 요소. 나는 다음과 같은 하위 쿼리를 얻고 왼쪽 가입 :

SELECT [ID] 
FROM #KSCEN 
WHERE [SEQ] = (SELECT MAX(B.[SEQ]) FROM #USER A LEFT JOIN #KSCEN B ON A.[KSCEN]=B.[ID]) 

이 작동하지만이 시스템으로 쿼리를 해결하기 위해 매우 빠른되지 않도록 해당 테이블 #USER, 내 경우에는, 이상 30,000,000 행이 포함 고려 모든 행을 결합한 다음 MAX를 찾아야합니다.

내 문제를 해결하는 더 효과적인 방법이 있습니까?

+0

최적화 질문이 CodeReview에 속하기 때문에이 질문을 주제와 관련이 없도록 닫으려고합니다. –

+1

@ScottHunter [query-optimization] 태그로 표시된 질문은이 주제에 관한 내용이 많으므로이 사이트에서 이러한 질문에 답변하는 사람들의 존경할만한 의견이 있습니다. –

답변

0

나는 where 절에서 사용한 correlated subquery을 피할 것입니다. from/where 절의 각 행이 각 행에 대해 하나의 새로운 쿼리 인 MAX() 계산에 대해 테스트 될 때 "행을 고생 시켜서 행"효과를 생성합니다.

with tUSER as 
(
    SELECT 'A.2017.JAN' AS [KSCEN], 'John' AS [Name], 'Doe' AS [Surname] UNION ALL 
    SELECT 'A.2017.JAN' AS [KSCEN], 'Paul' AS [Name], 'Red' AS [Surname] UNION ALL 
    SELECT 'A.2017.FEB' AS [KSCEN], 'John' AS [Name], 'Doe' AS [Surname] UNION ALL 
    SELECT 'A.2017.FEB' AS [KSCEN], 'Paul' AS [Name], 'Red' AS [Surname] UNION ALL 
    SELECT 'A.2017.MAR' AS [KSCEN], 'John' AS [Name], 'Doe' AS [Surname] UNION ALL 
    SELECT 'A.2017.MAR' AS [KSCEN], 'Paul' AS [Name], 'Red' AS [Surname] UNION ALL 
    SELECT 'A.2017.MAR' AS [KSCEN], 'Kate' AS [Name], 'Blue' AS [Surname] 
) 
, tKSCEN as (
    SELECT 'A.2017.JAN' AS [ID], 6 AS [SEQ] UNION ALL 
    SELECT 'A.2017.FEB' AS [ID], 7 AS [SEQ] UNION ALL 
    SELECT 'A.2017.MAR' AS [ID], 8 AS [SEQ] UNION ALL 
    SELECT 'A.2017.APR' AS [ID], 9 AS [SEQ] UNION ALL 
    SELECT 'A.2017.MAY' AS [ID], 10 AS [SEQ] 
) 
SELECT U.[KSCEN], MAX(K.[SEQ]) max_seq 
FROM tUSER U 
LEFT JOIN tKSCEN K ON U.[KSCEN]=K.[ID] 
GROUP BY U.[KSCEN] 
; 

Results :

당신은 SQL Fiddle

검색어 1에 그것을 시도 할 수 있습니다 : 실제 사용하는 테이블 또는 실행 계획의 혜택없이

, 나는 다음과 같은 제안
:

|  KSCEN | max_seq | 
|------------|---------| 
| A.2017.FEB |  7 | 
| A.2017.JAN |  6 | 
| A.2017.MAR |  8 |