Ну, во-первых, вам нужно получить количество для таблицы.Что-то вроде:
SELECT userid, COUNT(*) as count
FROM a
GROUP BY userid;
Получение значений из 'b' будет очень похожим.
Если у вас были оба этих запроса в виде таблиц, то для получения результата вам нужнонужно сделать что-то вроде:
SELECT DISTINCT aa.userid
FROM aa, bb
WHERE
aa.userid = bb.userid AND
aa.count != bb.count;
К счастью, вы можете объединить все так:
WITH aa AS (
SELECT userid, COUNT(*) as count
FROM a
GROUP BY userid),
bb AS (
SELECT userid, COUNT(*) as count
FROM b
GROUP BY userid)
SELECT DISTINCT aa.userid
FROM aa, bb
WHERE
aa.userid = bb.userid AND
aa.count != bb.count;
Хотя в выводе отсутствует 'E'.Таким образом, нам нужно сделать другое соединение и выбрать другое:
SELECT DISTINCT COALESCE(aa.userid, bb.userid)
FROM aa
FULL OUTER JOIN bb
ON aa.userid = bb.userid
WHERE
(aa.count != bb.count
OR aa.count IS NULL
OR bb.count IS NULL);
FULL OUTER JOIN
должен гарантировать, что мы получим результаты там, где есть строки в одной таблице, а не в другой.Это добавляет строки со значениями NULL
, которые мы должны рассмотреть.COALESCE
захватывает первое не-NULL
значение (поэтому, если в таблице b есть 'X', а в таблице a нет, то будет 'X').
Наконец, может быть NULL
в подсчете, поэтому мы с этим справимся.
Все вместе это выглядит так:
WITH aa AS (
SELECT userid, COUNT(*) as count
FROM a
GROUP BY userid),
bb AS (
SELECT userid, COUNT(*) as count
FROM b
GROUP BY userid)
SELECT DISTINCT COALESCE(aa.userid, bb.userid)
FROM aa
FULL OUTER JOIN bb
ON aa.userid = bb.userid
WHERE
(aa.count != bb.count
OR aa.count IS NULL
OR bb.count IS NULL);
SQLFiddle здесь
Отредактировано, чтобы добавить: Определенно есть более компактные способы сделать это (о чем свидетельствуют другие ответы).Этот способ имеет преимущество в построении простых запросов, поэтому мне это нравится.