2009-10-21 6 views
1
CREATE TABLE BlogPosts 
(
PostID INT PRIMARY KEY not null, 
PostTitle NVARCHAR , 
BlogID int, 
TotalComments int 
) 

이 쿼리를 상관 하위 쿼리 대신 단순화 할 수 있습니까?상관 하위 쿼리 대신 조인

SELECT TOP 5 * 
FROM BlogPosts as t0 
WHERE t0.PostID = (SELECT TOP 1 t1.PostID 
       FROM BlogPosts as t1 
       WHERE t0.BlogID = t1.BlogID 
       ORDER BY t1.TotalComments DESC) 

다른 블로그의 최대 TotalComments가 포함 된 5 개의 게시물이 필요합니다.

UPD. 만약 내가 제대로 이해하고 SQL 서버,하지만 난 postid 고유 표준 SQL

+0

RBDMS는 무엇입니까? SQL Server? – Asaph

+0

명시된 SQL은 주문되지 않으므로 상위 5 개가 특정 5 개의 행을 반환하지는 않습니다 ... Where 절을 충족시키는 5 개 이상의 행이있을 수 있습니다 ... 작성한대로 동일한 블로그 또는 혼합물에서 모두 5 명을 얻으십시오. 그들 중 어느 게 원하니? –

+0

아니요. 같은 블로그가 아닌 다른 블로그의 최고 댓글이 필요합니다. 그렇지 않으면 쉽게 될 것입니다. :) – rudnev

답변

1

을 선호하는, 그래서 이것은

편집 도움이 될 것입니다 다음

DECLARE @BlogPosts TABLE 
( 
    PostID INT PRIMARY KEY not null, 
    PostTitle NVARCHAR , 
    BlogID int, 
    TotalComments int 
) 

INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 1, 'A', 1, 3 
INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 2, 'B', 1, 4 
INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 3, 'C', 2, 5 
INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 4, 'D', 2, 6 
INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 5, 'E', 2, 7 
INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 6, 'F', 1, 8 
INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 7, 'G', 3, 9 
INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 8, 'H', 4, 10 
INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 9, 'I', 5, 11 
INSERT INTO @BlogPosts (PostID,PostTitle,BlogID,TotalComments) SELECT 10, 'J', 6, 5 

SELECT TOP 5 * 
FROM @BlogPosts bp INNER JOIN 
     (
      SELECT BlogID, 
        MAX(TotalComments) MaxComments 
      FROM @BlogPosts 
      GROUP BY BlogID 
     ) maxCommentsPerBlog ON bp.BlogID = maxCommentsPerBlog.BlogID 
          AND bp.TotalComments = maxCommentsPerBlog.MaxComments 
ORDER BY bp.TotalComments DESC 

당신은있을 수 있습니다

확인이 시도 여러 개의 최대 blog-totalComments 조합.

+0

@astander : "BlogPosts"대신 "@BlogPosts"가 필요한 이유는 무엇입니까? 임시 테이블이 아닙니다. – Asaph

+0

이것은 TSQL의 테스트 테이블 –

+0

입니다. 여기에 같은 블로그가있을 수 있습니다. 나는 다른 블로그를 말합니다 – rudnev

1

이 당신에게 블로그 당 최고 포스트 줄 것이다 : 또는

SELECT * FROM (
    SELECT *, Ranking = ROW_NUMBER() OVER (PARTITION BY BlogID ORDER BY TotalComments DESC) 
    FROM BlogPosts 
) a 
WHERE Ranking = 1 

:

SELECT b.* 
FROM (
    SELECT DISTINCT BlogID 
    FROM BlogPosts 
) a 
CROSS APPLY (
    SELECT TOP 1 b.* FROM BlogPosts b 
    WHERE a.BlogID = b.BlogID 
    ORDER BY b.TotalComments DESC 
) b 

은 당신이 찾고있는 무엇인가요?

+0

파티션으로 그것은 좋은, 감사합니다 조인보다 더 좋을 수 있습니다. – rudnev

0

왜 조인과 하위 쿼리가 필요합니까? 왜 쓸 수 없습니까?

SELECT TOP 5 * 
FROM @BlogPosts bp order by TotalComments desc; 
+0

아마도 @rudnev가 "다른 블로그에서 상위 5 개가 필요하기"때문일 것입니다. 검색어가 예를 들어 돌아올 수 있습니다. 하나의 블로그에서 상위 5 위. –