[英]How can I join two tables and get a count of the number of times the joins match if there might not be a corresponding entry in one table?
[英]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.