2017-04-21 265 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