3

我想要做的是:

SELECT *
FROM MainTable m
INNER JOIN JoinedTable j on j.ForeignID = m.ID
INNER JOIN (SELECT TOP 1 *
            FROM SubQueryTable sq
            WHERE sq.ForeignID = j.ID
            ORDER BY VersionColumn DESC)

所以基本上,从 SubQueryTable 中,我只想检索一个行,该行对于我可以从 JoinedTable 获得的具有特定 ID 的所有行的 VersionColumn 具有最大值。

T-SQL 不允许我这样做,有什么好的方法可以解决这个问题?

我试图阻止的是加载整个 SubQueryTable 并在为时已晚时进行过滤...。

SELECT *
FROM MainTable m
INNER JOIN JoinedTable j on j.ForeignID = m.ID
INNER JOIN (SELECT TOP 1 *
            FROM SubQueryTable sq
            ORDER BY VersionColumn DESC) sj ON sj.ForeignID = j.ID

我担心第二个版本首先执行非常慢的子查询,并且仅在加载所有行时才过滤它,但我想更快地过滤。

有什么想法吗?

4

2 回答 2

2

如果您在 VersionColumn 上有索引,这将表现良好

SELECT *
FROM MainTable m
INNER JOIN JoinedTable j on j.ForeignID = m.ID
CROSS APPLY (SELECT TOP 1 *
            FROM SubQueryTable sq
            WHERE  sq.ForeignID = j.ID
            ORDER BY VersionColumn DESC) sj
于 2013-10-16T13:51:23.543 回答
0

答案

你好,

下面的查询是我根据您的要求使用 Country、State 和 City 表创建的。

SELECT * FROM (
SELECT  m.countryName, j.StateName,c.CityName , ROW_NUMBER() OVER(PARTITION BY c.stateid ORDER BY c.cityid desc) AS 'x'
FROM CountryMaster m
INNER JOIN StateMaster j on j.CountryID = m.CountryID
INNER JOIN dbo.CityMaster c ON j.StateID = c.StateID 
) AS numbered WHERE x = 1

以下是您的解决方案,以上仅供您参考。

SELECT * FROM (
SELECT  m.MainTablecolumnNm, j.JoinedTablecolumnNm,c.SubQueryTableColumnName , ROW_NUMBER()
OVER(PARTITION BY sj.ForeignID ORDER BY c.sjID desc) AS 'abc'
FROM MainTable m
INNER JOIN JoinedTable j on j.ForeignID = m.ID
INNER JOIN SubQueryTable sj ON sj.ForeignID = j.ID 
) AS numbered WHERE abc = 1

谢谢你,维沙尔·帕特尔

于 2013-10-16T14:37:10.223 回答