Выберите элементы из таблицы, которые имеют различное количество () по сравнению с другой таблицей - PullRequest
0 голосов
/ 12 октября 2018

У меня есть две таблицы для примера:

Table A:
  userid
-----------
 A
 B
 C
 D
 D

Table B:
  userid
-----------
 A
 B
 C
 D
 D
 D
 E

Мне нужно получить элементы из таблицы B, чтобы их количество () в таблице B отличалось от их количества () в таблице A. Из приведенного выше примераМне нужно его напечатать:

Table Result:
-----------
D
E

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Ну, во-первых, вам нужно получить количество для таблицы.Что-то вроде:

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 здесь

Отредактировано, чтобы добавить: Определенно есть более компактные способы сделать это (о чем свидетельствуют другие ответы).Этот способ имеет преимущество в построении простых запросов, поэтому мне это нравится.

0 голосов
/ 12 октября 2018

Я тоже сделал один:

select distinct userid from table_b where 
(select count(userid) from table_b where userid = a.userid) != 
(select count(userid) from table_a where userid = a.userid);
0 голосов
/ 12 октября 2018
SELECT B.userid
FROM (SELECT userid, count(*) AS countB FROM TableB GROUP BY userid) B
  LEFT JOIN (SELECT userid, count(*) AS countA FROM TableA GROUP BY userid) A USING(userid)
WHERE A.countA != B.countB OR A.countA IS NULL;

Отредактировано для добавления песочницы для тестирования: https://rextester.com/CTKD25341

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...