Пример:
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); // ничего не нашло!!!
Подскажите в чем проблема? Почему ничего не находит?
У вас 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;
Модифицированный ваш пример
Сборка персонального компьютера от Artline: умный выбор для современных пользователей