[英]SQL Left Join on Two Different Tables
我有此表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之间进行左联接,除非没有Widget的WidgetHistory记录存在,在这种情况下,在Widget,Doodad和Thing之间进行联接。
谢谢。
我尝试使用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上使用函数IFNULL而不是ISNULL,但是两者似乎都以相同的方式工作。
我在MySQL上的测试:
小工具:
------ ----------- ------- | id | doodad_id | value | ------ ----------- ------- | 1 | 1 | 1 | | 2 | 5 | 5 | | 3 | 3 | 3 | | 4 | 6 | 6 | ------ ----------- -------
WidgetHistory
------ ----------- ------- | id | doodad_id | value | ------ ----------- ------- | 2 | 2 | 2 | | 4 | 4 | 4 | ------ ----------- -------
杜达(Doodad):
------ --------- | id | version | ------ --------- | 1 | 1 | | 2 | 2 | | 3 | 3 | | 4 | 4 | | 5 | 5 | | 6 | 6 | ------ ---------
和查询结果:
------ ------------------------------------------- --------- | id | IFNULL(widgetHistory.value, widget.value) | version | ------ ------------------------------------------- --------- | 1 | 1 | 1 | | 2 | 2 | 2 | | 3 | 3 | 3 | | 4 | 4 | 4 | ------ ------------------------------------------- ---------
由于适用于Doodad表,因此也应适用于Thing表。
我希望这个对你有用!
我会自己使用一个联合查询。 上半部分将加入WidgetHistory,而下半部分将不会加入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.