繁体   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