[英]Regarding SQL Server query and joining
基本上我有3個表user
, colors
和usercolor
。
表結構:
User
表具有諸如UserID
, UserName
列 Color
表具有諸如ColorID
, ColorName
列 UserColor
表具有UserID
, ColorID
列 當用戶首次登錄並進入我的視圖時,所有顏色都將被提取並帶有復選框顯示在視圖中,因此用戶可以選擇任何一個或多個。
當任何用戶從UI中選擇任何一種顏色或多種顏色並保存在db中時,userid和color id將被保存在用戶顏色表中,但是同一用戶再次查看則將顯示所有顏色,如果他先前選擇了任何人,則這些顏色名稱復選框將顯示為選中狀態。
我准備了一條SQL語句來獲取所有連接兩個表colors
和usercolor
顏色數據,但是當我指定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.