Получить не уникальные записи

180
06 мая 2018, 20:48

Пример:

create table records (id int);
insert into records values (1);
insert into records values (1);
insert into records values (2);
insert into records values (3);
insert into records values (3);
insert into records values (3);
insert into records values (4);
insert into records values (5);
create view v_records as
select * from records;
create view v_unique_records as
select * from v_records group by id;
select * // distinct не предлагать - полей для выбора в реальности не одно
from v_records
where id not in (select id from v_unique_records); // ничего не нашло!!!

Подскажите в чем проблема? Почему ничего не находит?

Answer 1

У вас view с именем v_unique_records будет содержать все значения поля id из таблицы records, так как вы выбираете полный набор значений. Далее, вы выбираете все записи, у которых id не равен полному набору значений(а он всегда равен, потому что принадлежит этому множеству). Соответственно, вы получите пустое множество и ни одна запись не возвращается.
Чтобы добиться того, чего вы хотите, нужно дополнительно использовать оператор Having, в котором можно задать фильтр с помощью агрегатной функции, в нашем случае задаем ограничение на количество записей в одной группе. Нас интересуют только группы, у которых количество записей равно 1.

Тогда ваш view для получения уникальных значений будет следующий:

create view v_unique_records as
select * from v_records group by id having count(id) = 1;

Модифицированный ваш пример

READ ALSO
правильный MySql запрос

правильный MySql запрос

Есть таблица ТоваровТаблица разделена на id,name

218
Железнодорожный вокзал

Железнодорожный вокзал

База данных "продажа билетов жд вокзала"Знатоки, подскажите, правильно составлена БД реляционная? Связи в схеме привязываются по ключам "№ поезда...

220
Ошибка подключения к бд 10061 MySQL

Ошибка подключения к бд 10061 MySQL

Установил MySQL, зашел в воркбенч, создал бдПосле перезагрузки ПК появилась ошибка

186
Списки инициализации

Списки инициализации

Расскажите в чем принципиальная разница между такими записями

204