2017-04-21 183 views
2

我有兩個表一是主表,另一個表是你可以從第一個表中選擇項目。CASE語句的SQL查詢

MasterTable

ItemID  ItemName 
1   Football 
2   Cricket 
3   Badminton 

SelectionTable

UserID  SelectedItemId 
1   2 
1   3 
2   1 

輸出

UserId  SelectedItemID  SelectionStatus 
1   1     False 
1   2     True 
1   3     True 

查詢

SELECT S.UserId,M.ItemID, 
     CASE M.ItemID 
      WHEN 1 Then 'True' 
      WHEN 2 Then 'True' 
      WHen 3 Then 'True' END AS SelectionStatus 
From MasterTable M 
JOIN SelectionTable S ON S.SelectedItemID=M.ItemID  
WHERE S.UserId=1 

如果沒有選擇任何項目,那麼所有的都是假的。我不知道該怎麼做。

+0

切換您m.itemID到S.SelectedItemID。並且左加入主選擇 – xQbert

回答

1

假設你有一個User表,您可以通過查詢cartesean產品(交叉連接)讓每一個用戶/項目組合的狀態。

可以確定TrueFalse的狀態是否存在SelectionTable中的對應記錄。

select 
    u.UserId, 
    m.ItemId, 
    case 
     when exists 
      (select * 
      from SelectionTable s 
      where s.UserId = u.UserId 
       and s.SelectedItemId = m.ItemId) 
     then 'True' 
     else 'False' 
    end 
from MasterTable m, User u 

這種技術可以應用到單用戶情況下(UserId等於1)如下:

select 
    m.ItemId, 
    case 
     when exists 
      (select * 
      from SelectionTable s 
      where s.UserId = 1 
       and s.SelectedItemId = m.ItemId) 
     then 'True' 
     else 'False' 
    end 
from MasterTable m 
+0

我只有兩個表,爲什麼會假設另一個表? – Anjyr

+0

通常當你有'UserId'時,它對應於一個自動生成的值。我修改了我的答案,爲一個'UserId'工作,並只使用了2個指定的表。 – dana

+1

順便說一句,我用你的第二種技術。它工作正常。 – Anjyr

0

您可以使用elseleft joinSelectionTableMasterTable

SELECT S.UserId,M.ItemID, 
     CASE M.ItemID 
      WHEN 1 Then 'True' 
      WHEN 2 Then 'True' 
      WHen 3 Then 'True' 
      else 'False' 
      END AS SelectionStatus 
From SelectionTable S 
    left JOIN MasterTable M ON S.SelectedItemID=M.ItemID  
WHERE S.UserId=1