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很糟糕,我相信你们已经猜到了^_^