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

この 2 番目のバージョンでは、最初に非常に遅いサブクエリが実行され、すべての行が読み込まれたときにのみフィルター処理されるのではないかと心配していますが、もっと早くフィルター処理したいと考えています。

何かご意見は?

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 に答える