Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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-选择具有不同组ID的用户对_Sql_Oracle - Fatal编程技术网

SQL-选择具有不同组ID的用户对

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

我必须用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.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.iduserSELECT 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
)