簡體   English   中英

關於SQL Server查詢和加入

[英]Regarding SQL Server query and joining

基本上我有3個表usercolorsusercolor

表結構:

  • User表具有諸如UserIDUserName
  • Color表具有諸如ColorIDColorName
  • UserColor表具有UserIDColorID

當用戶首次登錄並進入我的視圖時,所有顏色都將被提取並帶有復選框顯示在視圖中,因此用戶可以選擇任何一個或多個。

當任何用戶從UI中選擇任何一種顏色或多種顏色並保存在db中時,userid和color id將被保存在用戶顏色表中,但是同一用戶再次查看則將顯示所有顏色,如果他先前選擇了任何人,則這些顏色名稱復選框將顯示為選中狀態。

我准備了一條SQL語句來獲取所有連接兩個表colorsusercolor顏色數據,但是當我指定userid一條記錄就被提取了,這是不對的。 我想始終為每個用戶顯示所有不同的顏色名稱,如果用戶選擇了任何顏色,則該顏色名稱將通過選中的復選框顯示。

這是我的查詢:

SELECT        
    dbo.Colors.ColorID, dbo.Colors.ColorName, 
    ISNULL(dbo.UserColor.UserID, 0) AS IsSelected
FROM
    dbo.UserColor 
INNER JOIN
    dbo.Users ON dbo.UserColor.UserID = dbo.Users.UserID 
RIGHT OUTER JOIN
    dbo.Colors ON dbo.UserColor.ColorID = dbo.Colors.ColorID
WHERE        
   (dbo.Users.UserID = 1)

上面的查詢返回一個數據,但是我需要顯示所有顏色名稱和一個額外的字段,例如IsSelected ,以指示用戶先前選擇的顏色。 請幫我構造SQL。 謝謝

可以肯定,您正在按照這些思路尋找東西。

select c.ColorID
    , c.ColorName
    , IsSelected = case when uc.ColorID is null then 0 else 1 end
from dbo.Colors c
left join dbo.UserColor uc on uc.ColorID = c.ColorID and uc.UserID = 1 --leave this in the join or it becomes an inner join
left join dbo.Users u on u.UserID = uc.UserID

您可以通過子查詢嘗試使用此版本

DECLARE @userID as INT = NULL;

 SELECT uc.ColorID, uc.ColorName, max(uc.IsSelected) 
 FROM
 (
  SELECT 
        c.ColorID
        , c.ColorName
        , uc.UserID
        , IsSelected = case when uc.UserID = @userID then 1 else 0 end
    FROM dbo.Colors c
    LEFT JOIN dbo.UserColor uc on c.ColorID = uc.ColorID 
   ) uc
   WHERE uc.UserID = @userID OR uc.IsSelected = 0 
   GROUP BY uc.ColorID, uc.ColorName

這樣,您將始終在dbo中獲得所有顏色。要根據先前保存的選擇為您選擇的用戶選擇顏色。

您可以嘗試在雷斯特上工作

您確定要讓用戶使用多種顏色嗎? 您的結構允許用戶擁有該結構。 您可以通過將ColorId移到User表並跳過UserColor表來簡化...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM