私はアイテムの簡単なテーブルを持っています。それらを「パーツ」と呼びます。
各パーツは、個別のテーブルに 0 個以上の関連エントリを持つことができ、それらを「サブパーツ」と呼びます。おそらく予想されるように、テーブルの簡単なビューは次のとおりです。
Parts
-----
PartID int (PK)
PartName varchar
SubParts
--------
SubPartID int (PK)
PartID int (FK_Parts)
SubPartName varchar
SubPartAdded datetime
プライマリ テーブルからすべてのパーツを返したいのですが、存在する場合は LATEST (SubPartAdded DESC による順序) 関連の SubPart にもアクセスできます。
私の混乱は、subparts テーブルに (多くの異なるパーツに対して) 100 万以上のエントリがあり、存在する場合、現在のパーツの最新のものだけが必要であるということです。
前に、Parts テーブルと関連する Subparts の派生テーブルの間で左結合を実行するステートメントを作成しました (これは機能します) が、派生テーブルは subparts テーブルのすべての行を返すようで、パフォーマンス ヒットが発生します。PartID (およびその他の列) によってサブパーツを事前にフィルター処理するには、基本的に TOP 1 を実行し、派生した select ステートメントで DESC によって並べ替える必要があります。ただし、派生したselectステートメントで部品テーブル(外側)の列を参照できないように見えるため、派生テーブルにWHERE句を追加できません。
実行する次のスニペットも試しましたが、関連するレコードは返されません。
SELECT p.PartName, sp.SubPartName, sp.SubPartAdded
FROM Parts p
LEFT JOIN (SELECT TOP 1 SubPartID, SubpartAdded, PartID FROM SubParts ORDER BY SubPartAdded) AS sp
ON sp.PartID = p.PartID
「ON」ステートメントによってフィルタリングされる前に、「TOP 1」ステートメントが SubParts テーブル全体に対して実行されていると思います (?)
最終的には、メインのストアド プロシージャの複数の場所で Subparts テーブルのいくつかの列を使用する必要があるため、相関サブクエリを複数回呼び出す必要があるため、単純に相関サブクエリは必要ありません。
(この proc は、実行ごとに複数のパーツを返します。つまり、proc は単一の PartID によってフィルター処理されません)。
これがかなり明確であることを願っていますか?それは非常に単純な解決策を持つべきだと思われますが、私は現在困惑しています! (SQL Server 2K 以上との互換性が必要です)
よろしくニック