1

このテーブル 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 の間で結合を実行します。

ありがとう。

4

2 に答える 2

1

MySQL を試してみたところ、解決策が得られたと思います。SQL Server でも動作することを願っています。

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 d.ID = ISNULL(h.DoodadID, w.DoodadID) 
LEFT JOIN dbo.Thing as t ON t.ID = ISNULL(h.ThingID, w.ThingID)

MySQL で ISNULL の代わりに IFNULL 関数を使用する必要がありましたが、どちらも同じように機能するようです。

MySQL での私のテスト:

ウィジェット:

------ ----------- -------
| | ID | doodad_id | 値 |
 ------ ----------- -------
| | 1 | 1 | 1 |
| | 2 | 5 | 5 |
| | 3 | 3 | 3 |
| | 4 | 6 | 6 |
 ------ ----------- -------

ウィジェット履歴

------ ----------- -------
| | ID | doodad_id | 値 |
 ------ ----------- -------
| | 2 | 2 | 2 |
| | 4 | 4 | 4 |
 ------ ----------- -------

ドゥーダード:

------ ----------
| | ID | バージョン |
 ------ ----------
| | 1 | 1 |
| | 2 | 2 |
| | 3 | 3 |
| | 4 | 4 |
| | 5 | 5 |
| | 6 | 6 |
 ------ ----------

そしてクエリ結果:

------ ----------------------------------------------- - --------
| | ID | IFNULL(ウィジェット履歴.値, ウィジェット.値) | バージョン |
 ------ ----------------------------------------------- - --------
| | 1 | 1 | 1 |
| | 2 | 2 | 2 |
| | 3 | 3 | 3 |
| | 4 | 4 | 4 |
 ------ ----------------------------------------------- - --------

テーブル Doodad で機能するように、テーブル Thing でも機能するはずです。

うまくいくことを願っています!

于 2013-03-21T14:42:06.837 に答える
0

私は自分でユニオンクエリを使用します。上半分は WidgetHistory に参加し、下半分は参加しません。

于 2013-03-21T14:14:56.067 に答える