首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行嵌套子查询的更好方法

问执行嵌套子查询的更好方法
EN

Stack Overflow用户
提问于 2021-08-16 22:00:22
回答 3查看 106关注 0票数 0

我有一个使用Server的特定查询,但这可能不是最好的方法。我有一系列嵌套的子查询,但我无法找到正确的联接来使其工作。我有这样简单的桌子:

groupid

  • Table表UG链接用户和组-两个int列:uid和UG链接角色和组-两个int列:roleid和groupid

  • Table RU链接角色和用户-两个int列:roleid和uid

其目标是查找所有ug条目,其中groupid不在指定的roleid中,而仅适用于此特定角色的用户。就像预定义角色的异常一样。

这个在这里

代码语言:javascript
复制
select *
from ug 
where ug.uid in (select uid from ru where ru.roleid = 77)
  and ug.groupid not in (select groupid from rg where rg.roleid = 77)

是为roleid 77而工作的。但这是一种“糟糕”的做法吗?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-16 22:08:20

你的方法很好。但是,我强烈反对在子查询中使用not in,因为如果子查询返回任何NULL值,它就不会直观地工作。

为了保持一致性,我还通常使用exists而不是in (尽管没有语义问题)。这表明:

代码语言:javascript
复制
select *
from ug 
where exists (select 1 from ru where ug.uid = ru.uid and ru.roleid = 77) and
     not exists (select 1 from rg where ug.groupid = rg.groupid and rg.roleid = 77);
票数 1
EN

Stack Overflow用户

发布于 2021-08-16 22:08:26

当您的子查询中有很多结果时,这会更快。

代码语言:javascript
复制
SELECT ug.*
FROM ug
INNER JOIN ru ON ug.uig = ru.uid AND ru.roleid = 77
INNER JOIN rg ON ug.groupid = rg.groupid AND rg.roleid <> 77
票数 0
EN

Stack Overflow用户

发布于 2021-08-17 01:46:29

因此,现在我对我自己的问题有了更多的了解,我从上面两个想法中得到了一个新的解决方案。我们现在假设roleid可以是单个角色,也可以是任何roleid,甚至超过0,或者所有角色。在我的测试中,它似乎是一个新子表的左连接,其中roleid是空的,它只需要给出经典join venn图的左侧。

这提供了一个更明确的链接,因此我们只能从用户的角色中获取组。不管是哪个角色,这看起来都很有效。仍然测试自最后一个where子句看起来很奇怪,但需要限制范围仅限于人员在选定的角色。否则,我们返回所有的人,即使是那些没有在选定的角色。

对不起,我不知道完整的问题,但谢谢你的回答和指导。

代码语言:javascript
复制
select * from ug 
left join (
select ru.uid, ru.roleid, rg.groupid from ru inner join rg ru.roleid = rg.roleid
    and ru.roleid > 0 (or anything really)
) as rug on rug.uid = ug.uid and rug.groupid = ug.groupid
where roleid is null
and ug.uid in (select uid from ru where ru.roleid  > 0) (same as above roleid)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68809657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档