2011-03-09 6 views
1

다음 SQL 검색은 어떻게 수행합니까?

user_id, tournament_id, round 

가 어떻게 8 = 라운드 tournament_id = (26)의 사용자를 찾기 위해 검색을 수행하지만 것이다 다음 스키마를 가정하지 라운드 tournament_id = 26 일에서 = 7 즉

사용자가 하나 개의 행이 있습니다 라운드 tournament_id = 26 일 대한 tournament_id = 26 라운드 = 8 개

제로 행 = 내가 해봤

7

을하고

매우 느립니다.

+0

몇 가지 : 이것은 유일한 테이블입니까? 정확한 쿼리는 무엇입니까? 인덱스를 추가 했습니까? – rdvdijk

+0

정확하게 당신이 찾고있는 것이 명확하지 않습니다. 26,8 조합이있는 테이블의 행이나 토너먼트 26의 유일한 조합이 8 인 행을 찾고있는 것처럼 해석 될 수 있습니다. 즉, 해당 조합에 대한 항목이 필요하고 행이 없어야한다는 것을 의미합니다 26, <무엇이든 8>. – cairnz

답변

1
SELECT user_id 
FROM tournaments 
WHERE tournament_id = 26 
    AND [round] = 8 

EXCEPT 

SELECT user_id 
FROM tournaments 
WHERE tournament_id = 26 
    AND [round] = 7 

또는 중간 테이블 사용 :

SELECT user_id, [round] 
INTO tournament26 
FROM tournaments 
WHERE torunament_id = 26; 

SELECT user_id 
FROM tournament26 
WHERE [round] = 8 

EXCEPT 

SELECT user_id 
FROM tournament26 
WHERE [round] = 7 

것은 당신이 CTE를 사용하는 대신 수있는 SQL 서버에서를 중간 테이블 :

WITH tournament26 AS (
    SELECT user_id, [round] 
    FROM tournaments 
    WHERE tournament_id = 26 
) 
SELECT user_id 
FROM tournament26 
WHERE [round] = 8 

EXCEPT 

SELECT user_id 
FROM tournament26 
WHERE [round] = 7 
-1

사용자 테이블이 있다고 가정합니까?

이 시도 :

select * from users u 
join tournament t on t.user_id = u.id 
where t.tournament_id=26 and t.round=8 
0

작동 예 :

CREATE TABLE #t 
(
[user_id] INT, 
tournament_id INT, 
[round] INT 
) 

INSERT INTO #t 
SELECT 1, 26, 8 
UNION SELECT 1, 26, 7 
UNION SELECT 2, 26, 7 
UNION SELECT 3, 26, 7 
UNION SELECT 4, 26, 8 
UNION SELECT 4, 25, 8 
UNION SELECT 4, 25, 7 

SELECT user_id, tournament_id, MAX(round), COUNT(1) 
FROM #t 
WHERE tournament_id=26 
GROUP BY user_id, tournament_id 
HAVING COUNT(1) = 1 AND MAX(round) = 8 
관련 문제