繁体   English   中英

如何连接两个表,但从表1中获得结果,而表2中没有条目?

[英]How can I join two tables but get results from table one where theres no entry in table two?

我有一个菜单表和一个用户收藏夹表。 可以在“收藏夹”表中将收藏夹添加到特定用户。

我想在收藏夹表中获得用户没有记录的所有菜单项的列表。

我遇到了问题,因为当另一个用户正在使用我的收藏夹中的一个进行测试时,我永远无法获得完整列表。

--Data
SELECT DISTINCT MM.MenuName
FROM Portal.dbo.ModuleMenu MM
LEFT OUTER JOIN dbo.UserMenuFavourites MF
ON MM.MenuId = MF.MenuItemID
AND MF.UserID = NULL

WHERE [IsFavourite?] = 1

上面的代码返回完整列表,但不会删除用户一个已经在MF表中输入的列表。

您需要在用户上向联接添加条件:

SELECT MM.MenuName
FROM Portal.dbo.ModuleMenu MM
LEFT JOIN dbo.UserMenuFavourites MF
  ON MM.MenuId = MF.MenuItemID
  AND MF.UserID = ? -- Specify the user you're interested in here
WHERE [IsFavourite?] = 1
AND MF.UserID IS NULL -- This condition selects only non-joins

笔记:

  • 加入条件中可以包含非关键条件(很多人没有意识到这一点)
  • 对于左联接,所有列的值都为空,因此使联接列的条件为空的条件会滤除除非联接之外的所有列
  • 不需要DISTINCT ,因为没有连接时,第一个表中只有一行

问题在于where子句引用了left outer join联接中的第二个表。 如果没有匹配项,则为NULL

解决此问题的最佳方法是将条件移至on子句:

SELECT DISTINCT MM.MenuName
FROM Portal.dbo.ModuleMenu MM LEFT OUTER JOIN
     dbo.UserMenuFavourites MF
     ON MM.MenuId = MF.MenuItemID and
        MF.[IsFavourite?] = 1
WHERE MF.UserID = NULL;

NULL的比较可以在where子句中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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