我有一个菜单表和一个用户收藏夹表。可以在收藏夹表格中为特定用户添加收藏夹。
我想获取用户在收藏夹表中没有记录的所有菜单条目的列表。
我遇到了问题,因为当其他用户使用其中一个收藏夹时,我无法获得完整列表。
--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表中输入的代码。
答案 0 :(得分:1)
您需要在用户中添加条件:
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
,因为当没有连接时,第一个表中只有一行答案 1 :(得分:0)
问题是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
子句中。