Найти пользователей и их пропущенные значения - PullRequest
2 голосов
/ 28 января 2020

У меня есть таблица, как показано ниже:

declare @t as table
(
    userid int,
    val int
)

insert into @t(userid, val) values
(1,1),
(1,2),
(1,3),
(2,3),
(2,4),
(3,1),
(3,2),
(3,3),
(3,4),
(6,1),
(6,2),
(6,3),
(6,4)

ИД пользователя 3 и 6 имеет все возможные значения в столбце val (от 1 до 4), но не все пользователи.

I wi sh чтобы найти пользователей и их пропущенные значения из вышеприведенной таблицы, используя LEFT JOIN, и результат запроса для приведенной выше таблицы должен выглядеть следующим образом:

userid, val
1,      4
2,      1
2,      2

1 Ответ

1 голос
/ 28 января 2020

Вы можете cross join отдельные userid s и val s, а затем left join результирующий набор данных с исходной таблицей, чтобы найти отсутствующие кортежи:

select u.userid, v.val
from (select distinct userid from @t) u
cross join (select distinct val from @t) v
left join @t t on t.userid = u.userid and t.val = v.val
where t.userid is null
order by u.userid, v.val

Демонстрация на DB Fiddle :

userid | val
-----: | --:
     1 |   4
     2 |   1
     2 |   2
...