このテーブル Widget を WidgetHistory テーブルに結合して、ウィジェットの履歴データを収集する必要があります。各ウィジェットには Doodad テーブルと Thing テーブルにもレコードがあります。関連する各バージョンのウィジェットを返す sproc を使用しています。
注意が必要なのは、WidgetHistory テーブルが比較的新しく、最近変更されていない古いウィジェットは WidgetHistory テーブルに対応するレコードがないことです。ウィジェットの関連する各バージョンを取得しようとするとき、WidgetHistory、Doodad、および Thing テーブルの間で左結合を行っています。WidgetHistory レコードを持たないウィジェットについては、Widget、Doodad、および Thing テーブルをそのまま結合したいと考えています。
私は非常に限られたユースケースでこれを機能させましたが、WidgetHistory レコードを持つウィジェットで予期しない結果が得られると思うので、私はそれを心配しています。
(簡略化された)クエリは次のとおりです。
SELECT
w.ID,
ISNULL(h.Title, w.Title)
d.Version,
t.Size
FROM dbo.Widget as w
LEFT JOIN dbo.WidgetHistory as h ON w.ID = h.ID
LEFT JOIN dbo.Doodad as d ON h.DoodadID = d.ID /*!*/ OR w.DoodadID = d.ID
LEFT JOIN dbo.Thing as t ON h.ThingID = t.ID /*!*/ OR w.ThingID = t.ID
私が気になるのは、 ! の後の部分です。最後の 2 つの結合について。代わりに、Widget、Doodad、および Thing の間だけで個別の一連の左結合を実行できることはわかっていますが、それは過剰に思えます (しかし、そうではないのでしょうか?)。
これまたはより良い戦略について何か考えはありますか? ここでも、ウィジェットの WidgetHistory レコードが存在しない場合を除いて、WidgetHistory、Doodad、および Thing の間で左結合を実行したいと考えています。その場合は、Widget、Doodad、および Thing の間で結合を実行します。
ありがとう。