【问题标题】:SQL Server 2008 select top 1 row from multiple tables?SQL Server 2008 从多个表中选择前 1 行?
【发布时间】:2009-10-19 09:26:56
【问题描述】:

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

文章表:

ID #CategoryID #Text #Date

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

现在我希望能够从 x 个类别中加载最新文章。我有一个 SP,它接受一个 nvarchar,其 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

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

【问题讨论】:

    标签: sql-server select


    【解决方案1】:
    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

    【讨论】:

      【解决方案2】:

      我知道这个问题已经得到解答,但您可以对各个类别进行排名,然后使用 WHERE 子句 用 OR 过滤它们,例如 WHERE rankA =1 OR rankB = 1或 rankc = 1

      它将打印所有最高排名,例如,我在此查询中对 Salary 和 Costs 进行了排名并打印了

      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
      

      样本数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多