我有这张表 Widget,我需要加入 WidgetHistory 表来收集关于我的小部件的历史数据。每个小部件在 Doodad 和 Thing 表中也有一条记录。我正在使用一个返回小部件每个相关版本的存储过程。
棘手的部分是 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
我怀疑的部分是 ! 最后两个连接。我知道我可以单独在 Widget、Doodad 和 Thing 之间进行一系列单独的左连接,但这似乎过度(但也许不是?)。
对此或更好的策略有什么想法吗?同样,我想在 WidgetHistory、Doodad 和 Thing 之间进行左连接,除非小部件不存在 WidgetHistory 记录,在这种情况下,请在 Widget、Doodad 和 Thing 之间进行连接。
谢谢。