Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL在两个表之间进行多次检查并存储它们_C#_Asp.net_Sql - Fatal编程技术网

C# SQL在两个表之间进行多次检查并存储它们

C# SQL在两个表之间进行多次检查并存储它们,c#,asp.net,sql,C#,Asp.net,Sql,我正在Visual Studio 2005上使用C ASP.NET以及SQL Server 2005 目前,我有一个项目,要求我检查每个用户可能拥有的任何冲突角色 我有两个数据库。用户和冲突角色。以下是两个表的结构: 在用户中,我有2个唯一的用户,每个用户有4个角色 在冲突角色中,我有4行冲突角色 詹姆斯和詹妮弗各有4个角色,每个角色都相互冲突 我想形成多个SQL查询,检查每个用户拥有的每个角色是否与他们拥有的任何其他角色冲突 我大致了解该过程会是什么样子,但我不确定如何使用多个SQL查询来描述

我正在Visual Studio 2005上使用C ASP.NET以及SQL Server 2005

目前,我有一个项目,要求我检查每个用户可能拥有的任何冲突角色

我有两个数据库。用户和冲突角色。以下是两个表的结构:

在用户中,我有2个唯一的用户,每个用户有4个角色

在冲突角色中,我有4行冲突角色

詹姆斯和詹妮弗各有4个角色,每个角色都相互冲突

我想形成多个SQL查询,检查每个用户拥有的每个角色是否与他们拥有的任何其他角色冲突

我大致了解该过程会是什么样子,但我不确定如何使用多个SQL查询来描述该想法:

1一次一行,grep Users usr表中的值usr.UserID和usr.Role

将usr.UserID存储在临时变量tempUID中,并在ConflictingRoles cf表中查找usr.Role与cf.Role的匹配值

2如果usr.Role与cf.Role匹配,则grep cf.ConflictingRole的值,并在usr.UserID与tempUID匹配的Users表中运行所有usr.Role

如果在cf.ConflictingRole与用户tempUID的usr.Role之间发现匹配/冲突,请将cf.ConflictingRole、usr.Role和user.Name插入单独的表中,然后返回结果

3对每个用户拥有的所有角色和所有用户重复此操作

基本上,不允许用户同时拥有两个相互冲突的角色。如果有,则将名称、角色和冲突角色存储在表中

这对我来说非常混乱,我不确定是否有更简单的方法来做

若并没有,我想请求你们对SQL查询的帮助,我必须用我上面的逻辑序列来形成SQL查询

SqlConnection thisConnection = new SqlConnection("Data Source=DS");
SqlCommand nonqueryCommand = thisConnection.CreateCommand();
thisConnection.Open();

      //multiple sql commands
      nonqueryCommand.CommandText = "<SQL Query>";
      Console.WriteLine(nonqueryCommand.ExecuteNonQuery());

      ...
感谢您提前提供的帮助。

第一种方法:

SELECT u1.UserID, MIN(u1.Role) AS Role, MAX(u2.Role) AS ConflictingRole
FROM Users AS u1
JOIN Users AS u2 ON u1.UserID = u2.UserID AND u1.Role <> u2.Role
JOIN ConflictingRoles AS cr ON cr.Role = u1.Role AND cr.ConflictingRole = u2.Role
Group By u1.UserID, MIN(u1.Role), MAX(u2.Role)
Insert into results(userID, role, conflictingRole)
Select distinct
     U.UserId, U.role, C.conflictionRole
FROM
     users U 
   inner join  --join role with all conflicted roles
     conflictingRoles C
       on U.role = C.role
WHERE
     --chech if user has conflicted role
     exists (
        select * 
        from Users U2
        where  U2.userId = U.userId and
               U2.role = C.conflictionRole
        )
注意,您的用户表没有完全规范化。建议:用户详细信息用户ID、名称应位于“实体”表中,用户与其角色之间的关系应位于单独的“关系”表中

您尚未发布架构的约束,但可能是下面代码U1中的约束。角色U2.Role可以更改为U1.Role
WITH Users 
     AS 
     (
      SELECT * 
        FROM (
              VALUES ('R001', 'James', 'ISP001'), 
                     ('R001', 'James', 'ISP002'), 
                     ('R001', 'James', 'OSF001'), 
                     ('R001', 'James', 'OSF002'), 
                     ('P005', 'Jennifer', 'JEP001'), 
                     ('P005', 'Jennifer', 'JEP002'), 
                     ('P005', 'Jennifer', 'FGA001'), 
                     ('P005', 'Jennifer', 'FGA002'), 
                     ('S055', 'OneDayWhen', 'ISP001'), 
                     ('S055', 'OneDayWhen', 'OSF001'), 
                     ('S055', 'OneDayWhen', 'FGA001')
             ) AS T (UserID, Name, Role)
     ), 
     ConflictingRoles AS 
     (
      SELECT * 
        FROM (
              VALUES ('ISP001', 'ISP002'), 
                     ('OSF001', 'OSF002'), 
                     ('JEP001', 'JEP002'), 
                     ('FGA001', 'FGA002') 
             ) AS T (Role, ConflictingRole)
     ), 
     PotentiallyConflictingRoles
     AS
     (
      SELECT U1.UserID, U1.Role, U2.Role AS PotentiallyConflictingRole
        FROM Users U1
             JOIN Users U2
                ON U1.UserID = U2.UserID
                   AND U1.Role <> U2.Role
     )
SELECT *
  FROM PotentiallyConflictingRoles P1
 WHERE EXISTS (
               SELECT * 
                 FROM ConflictingRoles C1
                WHERE C1.Role = P1.Role
                      AND C1.ConflictingRole = P1.PotentiallyConflictingRole
              );

@谢谢Imre L的帮助,但是当我把它应用到我的代码中时,我遇到了一些错误。如果你理解它,那就更重要了。我已尽力使它易于理解。