我有一个使用Server的特定查询,但这可能不是最好的方法。我有一系列嵌套的子查询,但我无法找到正确的联接来使其工作。我有这样简单的桌子:
groupid
UG链接用户和组-两个int列:uid和UG链接角色和组-两个int列:roleid和groupid
RU链接角色和用户-两个int列:roleid和uid其目标是查找所有ug条目,其中groupid不在指定的roleid中,而仅适用于此特定角色的用户。就像预定义角色的异常一样。
这个在这里
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而工作的。但这是一种“糟糕”的做法吗?
谢谢!
发布于 2021-08-16 22:08:20
你的方法很好。但是,我强烈反对在子查询中使用not in,因为如果子查询返回任何NULL值,它就不会直观地工作。
为了保持一致性,我还通常使用exists而不是in (尽管没有语义问题)。这表明:
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);发布于 2021-08-16 22:08:26
当您的子查询中有很多结果时,这会更快。
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发布于 2021-08-17 01:46:29
因此,现在我对我自己的问题有了更多的了解,我从上面两个想法中得到了一个新的解决方案。我们现在假设roleid可以是单个角色,也可以是任何roleid,甚至超过0,或者所有角色。在我的测试中,它似乎是一个新子表的左连接,其中roleid是空的,它只需要给出经典join venn图的左侧。
这提供了一个更明确的链接,因此我们只能从用户的角色中获取组。不管是哪个角色,这看起来都很有效。仍然测试自最后一个where子句看起来很奇怪,但需要限制范围仅限于人员在选定的角色。否则,我们返回所有的人,即使是那些没有在选定的角色。
对不起,我不知道完整的问题,但谢谢你的回答和指导。
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)https://stackoverflow.com/questions/68809657
复制相似问题