我怎样才能加入两个表,但从表一中得到结果,表2中没有条目?

时间:2014-01-16 13:01:12

标签: sql tsql join

我有一个菜单表和一个用户收藏夹表。可以在收藏夹表格中为特定用户添加收藏夹。

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

我遇到了问题,因为当其他用户使用其中一个收藏夹时,我无法获得完整列表。

--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表中输入的代码。

2 个答案:

答案 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

注意:

  • 您可以在连接条件中拥有非关键条件(许多人都没有意识到这一点)
  • 对于左连接,所有列值都为null,因此,如果连接列的条件为空,则会过滤除非连接之外的所有列
  • 不需要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子句中。