В конце концов, это всего лишь комбинации для двух пользователей, кроме найденных в группе. В основном у нас есть MINUS
, NOT EXISTS
и NOT IN
.
МИНУС
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
)
Как видите, три запроса мало чем отличаются. Хотя запрос MINUS
выглядит наиболее простым, он имеет тот недостаток, что вы не можете напрямую отображать имена пользователей, если хотите. EXISTS
подзапросы выглядят немного сложнее, чем IN
подзапросы. (NOT IN
содержит ловушку, хотя значения могут быть нулевыми, что здесь не так.) Мой выбор будет NOT IN
здесь, но просто выберите то, что вам больше нравится.
(На примечание: USER
и GROUP
являются ключевыми словами SQL и, по моему мнению, не являются хорошим выбором для имен таблиц.)