繁体   English   中英

SQL在两个不同的表上左联接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM