SQL Server 2008从多个表中选择前1行?

时间:2009-10-19 09:26:56

标签: sql-server select

我有一个存储文章的表,例如:

文章表:

ID #CategoryID #Text #Date

所以在页面上我有不同的部分,每个部分都有自己的categoryID。例如,体育是1,新闻是2等。

现在我想要从x个类别中加载最新文章。我有一个带有nvarchar的SP,其ID由空格分隔。

现在的问题是,如何从nvarchar中的类别中选择最新插入的文章?

我使用Erland Sommerskog的nvarchar-to-table将ID放入表格中http://www.sommarskog.se/arrays-in-sql-2005.html#iter-list-of-integers

通常我会使用类似的东西来选择几个类别的文章:

SELECT TOP 5 ArticleID, Headline, CategoryID, ShortDescription, DatePublished 
FROM Article 
WHERE ArticleState = 3 
AND CategoryID IN (SELECT i.number FROM iter_intlist_to_tbl(@Categories) AS i)
ORDER BY DatePublished DESC

但是,我如何只从所提供的每个类别中选择最后一篇文章?

2 个答案:

答案 0 :(得分:3)

SELECT  a.*
FROM    iter_intlist_to_tbl(@Categories) i
OUTER APPLY 
        (
        SELECT  TOP 1 *
        FROM    Article
        WHERE   CategoryID = i.number
                AND ArticleState = 3
        ORDER BY
                DatePublished DESC
        ) a

这将从每个类别中选择ArticleState = 3的最新文章,或者如果某个类别中没有此类文章,则选择NULL

答案 1 :(得分:0)

我知道已经回答了这个问题,但是您可以对各种类别进行排名,只需使用 WHERE子句 对其进行OR过滤即可,例如WHERE rankA = 1 OR rankB = 1或rankc = 1

它将打印所有排名最高的文件,例如,我已在此查询中对薪金和成本进行排名并打印出

WITH RESULT AS
(
    SELECT M.UserID
        ,M.FirstName
        ,M.LastName
        ,M.Salary
        ,Salary_Rank = DENSE_RANK() OVER(ORDER BY Salary DESC)
        ,M.Costs
        ,Costs_Rank = DENSE_RANK() OVER(ORDER BY Costs DESC)
    FROM temp.dbo.MainData AS M
)
SELECT R.UserID
    ,R.FirstName
    ,R.LastName
    ,R.Salary
    ,R.Salary_Rank
    ,R.Costs
    ,R.Costs_Rank

FROM RESULT AS R
WHERE Salary_Rank = 1 OR Costs_Rank = 1

样本数据

enter image description here