在尝试优化 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/