Получите разницу уникального и дублирующего набора - SQL - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть два одинаковых набора данных (таблица, представление, CTE), один из которых содержит уникальные строки (гарантируется DISTINCT или GROUP BY), второй содержит дубликаты (без ограничения первичного ключа).

Как я могу получить разницу двух наборов данных, чтобы я мог получить только дубликаты второго набора в MySql 8?

Скажем, у меня есть таблица под названием Животные, в которой хранятся NAME и SPECIES.

 +---------+--------------+------+-----+---------+-------+
 | Field   | Type         | Null | Key | Default | Extra |
 +---------+--------------+------+-----+---------+-------+
 | ID      | int(11)      | NO   | PRI | NULL    |       |
 | NAME    | varchar(255) | YES  |     | NULL    |       |
 | SPECIES | varchar(255) | YES  |     | NULL    |       |
 +---------+--------------+------+-----+---------+-------+

 ANIMALS
 +----+---------+-------------+
 | ID | NAME    | SPECIES     |
 +----+---------+-------------+
 |  1 | Lion    | Carnivorous |
 |  2 | Giraffe | Herbivores  |
 |  3 | Zebra   | Herbivores  |
 |  4 | Trutle  | Herbivores  |
 |  5 | Tiger   | Carnivorous |
 |  6 | Bear    | Carnivorous |
 +----+---------+-------------+

Имея это, я определяю представление DUPLICATED.

 CREATE VIEW DUPLICATED AS
     SELECT * FROM ANIMALS
     UNION ALL
     SELECT * FROM ANIMALS WHERE SPECIES = "Carnivorous";

(Дублирует каждого плотоядного в наборе)

 DUPLICATED
 +---------+-------------+-----+
 | NAME    | SPECIES     | CNT |
 +---------+-------------+-----+
 | Lion    | Carnivorous |   2 |
 | Tiger   | Carnivorous |   2 |
 | Bear    | Carnivorous |   2 |
 | Giraffe | Herbivores  |   1 |
 | Zebra   | Herbivores  |   1 |
 | Trutle  | Herbivores  |   1 |
 +---------+-------------+-----+

Теперь я хочу получить разницу в SELECT * FROM ANIMALS и DUPLICATED или наоборот, важно получить всех хищных от ANIMALS.

1 Ответ

0 голосов
/ 28 апреля 2019

По сути, вы можете группировать по любой комбинации полей, которые гарантируют уникальность записи в вашем результате. Вы не предоставили свои запросы или схему вашей таблицы, поэтому я попытаюсь продемонстрировать это на общем примере. Вы можете получить мой дрейф и применить его к вашему запросу.

SELECT field1, field2, field3 COUNT(*)
FROM MyTable
GROUP BY field1, field2, field3
HAVING COUNT(*) > 1
...