2014-01-16 35 views
0

我有一個菜單表和一個用戶收藏夾表。可以將收藏夾添加到收藏夾表中的特定用戶。如何連接兩個表格,但從表格一得到結果,而表格二沒有輸入?

我想獲取用戶在收藏夾表中沒有記錄的所有菜單條目的列表。

我遇到了問題,因爲當其中一個收藏夾被另一個用戶使用到我正在測試的某個收藏夾時,我永遠無法獲得完整列表。

--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表中輸入的代碼。

回答

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,因爲從第一個表只有不斷一行時,有沒有加入
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子句。

相關問題