sql - SQL 内连接问题

标签 sql sql-server

在尝试优化 SQL 时遇到一些问题。

我有 2 个这样的表:

Names
id, analyseid, name

Analyses
id, date, analyseid.

我想从“分析”中获取“名称”中每个名称(它们是唯一的)的最新分析(按日期排序)。我真的不知道如何在不使用 2 个嵌套选择的情况下做到这一点。

我的尝试(不要对名称感到困惑。原理是一样的):

SELECT
 B.id,
 B.chosendatetime,
 vStockNames.name
FROM
 vStockNames
INNER JOIN
 (
 SELECT TOP 1
  vAnalysesHistory.id,
  vAnalysesHistory.chosendatetime,
  vAnalysesHistory.companyid
 FROM
  vAnalysesHistory
 ORDER BY
  vAnalysesHistory.chosendatetime DESC
 ) AS B
ON
 B.companyid = vStockNames.stockid

在我的示例中,问题是我只返回 1 行(因为 top 1)。但如果我排除这个,我可以获得同名的多个分析。

你能帮我吗? - 提前致谢。

最佳答案

SQL Server 2000+:

 SELECT (SELECT TOP 1 
                a.id
           FROM vAnalysesHistory AS a 
          WHERE a.companyid = n.stockid 
       ORDER BY a.chosendatetime DESC) AS id,
        n.name, 
        (SELECT TOP 1 
                a.chosendatetime 
           FROM vAnalysesHistory AS a 
          WHERE a.companyid = n.stockid 
       ORDER BY a.chosendatetime DESC) AS chosendatetime
   FROM vStockNames AS n 

SQL Server 2005+,使用 CTE:

WITH cte AS (
   SELECT a.id,
          a.date,
          a.analyseid,
          ROW_NUMBER() OVER(PARTITION BY a.analyseid
                                ORDER BY a.date DESC) AS rk
     FROM ANALYSES a)
SELECT n.id, 
       n.name,
       c.date
  FROM NAMES n
  JOIN cte c ON c.analyseid = n.analyseid
            AND c.rk = 1

...没有 CTE:

SELECT n.id, 
       n.name,
       c.date
  FROM NAMES n
  JOIN (SELECT a.id,
               a.date, 
               a.analyseid,
               ROW_NUMBER() OVER(PARTITION BY a.analyseid
                                     ORDER BY a.date DESC) AS rk
          FROM ANALYSES a) c ON c.analyseid = n.analyseid
                            AND c.rk = 1

关于sql - SQL 内连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3754526/

相关文章:

sql-server - Excel powerpivot更新错误 "object was not found in the cube"

sql - 如何有效地记录数据库(表,属性定义)?

javascript - 如何在 JavaScript 中将 MSSQL 日期时间整数转换为 YYYY/mm/DD 格式

php - php与sql server集成的问题

mysql - 左连接查询未按计划进行

sql - 如何将整数数组传递给 IN 子句?

sql - 为什么批量插入/更新速度更快?批量更新如何进行?

sql-server - 在 TFS 中映射本地目录时发生数据库错误(SQL 错误 18054)

sql - Spark SQL查询与DataFrame函数

c# - 如何从 Excel 工作表中获取列名?