Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
SQL选择的优先级不存在_Sql_Select - Fatal编程技术网

SQL选择的优先级不存在

SQL选择的优先级不存在,sql,select,Sql,Select,我很困惑如何构造我需要的查询: select distinct NodeID from GroupsTable where GroupID in ( select GroupID from UserGroupsTable where UserID = @UserID ) 我需要从用

我很困惑如何构造我需要的查询:

select distinct NodeID from GroupsTable
                    where GroupID in
                    (
                        select GroupID from UserGroupsTable
                        where UserID = @UserID
                    )
我需要从用户属于多个组的GroupsTable中选择NodeID,除非用户所属的任何组都没有该NodeID

上面的代码仅从GroupsTable中选择一个节点ID,该节点ID位于任何一个用户组中

因此:

组|节点

1 | A 1 | B 2 | A

例如,我只需要选择B

有什么想法吗?

您可以使用having子句来确保每个节点的组数小于用户所在的所有组数:

select  g.NodeID
from    GroupsTable g
join    UserGroupsTable ug 
on      g.GroupID = ug.GroupID
where   ug.UserID = 1
group by
        ug.UserID
,       g.NodeID
having  COUNT(distinct g.GroupID) < 
        (
        select  COUNT(distinct GroupID) 
        from    UserGroupsTable ug2 
        where   ug2.UserID = ug.UserID
        )
可以使用having子句确保每个节点的组数小于用户所在的所有组数:

select  g.NodeID
from    GroupsTable g
join    UserGroupsTable ug 
on      g.GroupID = ug.GroupID
where   ug.UserID = 1
group by
        ug.UserID
,       g.NodeID
having  COUNT(distinct g.GroupID) < 
        (
        select  COUNT(distinct GroupID) 
        from    UserGroupsTable ug2 
        where   ug2.UserID = ug.UserID
        )
假设这是SQL Server,版本>=2005,用于使用count*over

@回答条件发生变化后的评论

假设这是SQL Server,版本>=2005,用于使用count*over


@回答“条件已更改”下面的注释

因此,如果用户所属的所有组都共享节点ID,则您希望选择该节点ID?换言之,是否需要选择属于用户所属的每个组的所有节点?在您的示例中,B不属于所有组,与A不同。为什么要选择B而不是A?@Quassnoi,@Damien-这正是我所需要的。您能在两个表中提供示例数据以进一步说明吗?基于此,我们可以尝试进行必要的查询。如果用户所属的所有组都共享节点ID,您是否希望选择节点ID?换言之,是否需要选择属于用户所属的每个组的所有节点?在您的示例中,与a不同,B不属于所有组。为什么要选择B而不是a?@Quassnoi,@Damien-这正是我所需要的。你能在两个表格中提供样本数据以进一步澄清吗?基于此,我们可以尝试进行所需的queryAKA关系划分,如果您按g.NodeID分组,countdistinct g.NodeID是否为1?@Ted-奇怪。。这与我在所有小组中给出的答案的结果相同,您认为这些答案与需求相反。当然,如果按g.NodeID分组,倒testAKA关系除法的相同解决方案不是countdistinct g.NodeID=1吗?@Ted-奇怪。。这与我在所有小组中给出的答案的结果相同,您认为这些答案与需求相反。同样的解决方案当然是反向测试感谢您的努力-您的选择几乎是正确的,但与所需相反。它选择了所有组中的节点ID,而不是仅选择某些组中存在的节点ID,但不是all@Ted-逆-这难道不像将最后一行更改为!=”那么简单吗?事实上——但我发现count*UG.GroupCount可以完美地用于多个组,但如果用户只在一个组中,它将不返回任何内容——而它应该返回该单个组的所有nodeID。这可能很容易改变,但我对sql很糟糕,我相信你们已经猜到了^_^谢谢你的努力-你的选择几乎是正确的,但与要求相反。它选择了所有组中的节点ID,而不是仅选择某些组中存在的节点ID,但不是all@Ted-逆-这难道不像将最后一行更改为!=”那么简单吗?事实上——但我发现count*UG.GroupCount可以完美地用于多个组,但如果用户只在一个组中,它将不返回任何内容——而它应该返回该单个组的所有nodeID。这可能很容易改变,但我对sql很糟糕,我相信你们已经猜到了^_^