Присоединяйтесь вместо коррелированного подзапроса - PullRequest
1 голос
/ 21 октября 2009
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)

Мне нужно 5 постов с максимальным TotalComments из разных блогов.

UPD. SQL Server, но я бы предпочел стандартный SQL

Ответы [ 3 ]

1 голос
/ 22 октября 2009

Это даст вам верхнюю запись в блоге:

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

Это то, что вы ищете?

1 голос
/ 21 октября 2009

Если я правильно понимаю, postid уникален, так что это должно помочь

EDIT:

ОК, попробуйте тогда

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

Возможно, у вас может быть несколько комбинаций max blog-totalComments.

0 голосов
/ 17 июня 2013

зачем нужны объединения и подзапросы? Почему ты не можешь написать

SELECT  TOP 5 *
FROM    @BlogPosts bp order by TotalComments desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...