SQL-选择具有不同组ID的用户对
我必须用SQL编写一个查询,返回在同一组中从未关联在一起的用户名和姓氏对 团体 使用者 我试过了,但没用,为什么SQL-选择具有不同组ID的用户对,sql,oracle,Sql,Oracle,我必须用SQL编写一个查询,返回在同一组中从未关联在一起的用户名和姓氏对 团体 使用者 我试过了,但没用,为什么 SELECT u1.name, u1.surname, u2.name, u2.surname FROM group g1 JOIN group g2 ON g2.idgroup = g1.idgroup JOIN user u1 ON u1.userid = g1.iduser JOIN user u2 ON u2.userid = g2.iduser WHERE g2.id
SELECT u1.name, u1.surname, u2.name, u2.surname
FROM group g1
JOIN group g2 ON g2.idgroup = g1.idgroup
JOIN user u1 ON u1.userid = g1.iduser
JOIN user u2 ON u2.userid = g2.iduser
WHERE g2.idgroup <> g1.idgroup
您的尝试失败,因为它只是检查这对用户是否至少有一个组不相同,而您想检查所有组是否不同 您可以自联接users表以生成所有可能的用户对,然后将not exists与聚合相关子查询一起使用,以确保在两个用户同时出现的位置不存在任何组:
select u1.name name1, u1.surname surname1, u2.name name2, u2.surname surname2
from users u1
inner join users u2 on u1.id_user < u2.id_user
where not exists (
select 1
from groups g
group by g.id_group
having
max(case when g.id_user = u1.id_user then 1 end) = 1
and max(case when g.id_user = u2.id_user then 1 end) = 1
)
我认为不存在:
毕竟,这只是两个用户的组合,除了组中的用户。我们主要有负数,不存在,也不存在 减 不在 不存在 如您所见,这三个查询没有太大区别。虽然减号查询看起来最简单,但它的缺点是,如果愿意,您不能直接显示用户名。EXISTS子查询看起来总是比子查询中的查询复杂一点。然而,当值可以为null时,notin会保留一个陷阱,这里的情况并非如此。我的选择不是在这里,而是挑你最喜欢的
另一方面:用户和组都是SQL关键字,因此在我看来不是表名的好选择。你在用什么?Mureinik我在用Oracle。我是新手,所以请原谅我的问题。我从未见过在u1.iduser
SELECT u1.name, u1.surname, u2.name, u2.surname
FROM group g1
JOIN group g2 ON g2.idgroup = g1.idgroup
JOIN user u1 ON u1.userid = g1.iduser
JOIN user u2 ON u2.userid = g2.iduser
WHERE g2.idgroup <> g1.idgroup
select u1.name name1, u1.surname surname1, u2.name name2, u2.surname surname2
from users u1
inner join users u2 on u1.id_user < u2.id_user
where not exists (
select 1
from groups g
group by g.id_group
having
max(case when g.id_user = u1.id_user then 1 end) = 1
and max(case when g.id_user = u2.id_user then 1 end) = 1
)
select u1.iduser, u2.iduser
from users u1 join
users u2
on u1.iduser < u2.iduser
where not exists (select 1
from usergroups ug1 join
usergroups ug2
on ug1.idgroup = ug2.idgroup
where ug1.iduser = u1.iduser and
ug2.iduser = u2.iduser
);
select u1.iduser, u2.iduser from "USER" u1 join "USER" u2 on u1.iduser < u2.iduser
minus
select g1.iduser, g2.iduser from "GROUP" g1 join "GROUP" g2 on g1.idgroup = g2.idgroup
and g1.iduser < g2.iduser
select u1.iduser, u2.iduser from "USER" u1 join "USER" u2 on u1.iduser < u2.iduser
where (u1.iduser, u2.iduser) not in
(
select g1.iduser, g2.iduser from "GROUP" g1 join "GROUP" g2 on g1.idgroup = g2.idgroup
and g1.iduser < g2.iduser
)
select u1.iduser, u2.iduser from "USER" u1 join "USER" u2 on u1.iduser < u2.iduser
where not exists
(
select null from "GROUP" g1 join "GROUP" g2 on g1.idgroup = g2.idgroup
where g1.iduser = u1.iduser
and g2.iduser = u2.iduser
)