Оператор EXCEPT в PostgreSQL позволяет найти разность двух выборок, то есть те строки которые есть в первой выборке, но которых нет во второй. Для его использования применяется следующий формальный синтаксис:
SELECT_выражение1 EXCEPT SELECT_выражение2
Для примера возьмем таблицы из прошлой темы:
CREATE TABLE Customers ( Id SERIAL PRIMARY KEY, FirstName VARCHAR(20) NOT NULL, LastName VARCHAR(20) NOT NULL, AccountSum NUMERIC DEFAULT 0 ); CREATE TABLE Employees ( Id SERIAL PRIMARY KEY, FirstName VARCHAR(20) NOT NULL, LastName VARCHAR(20) NOT NULL ); INSERT INTO Customers(FirstName, LastName, AccountSum) VALUES ('Tom', 'Smith', 2000), ('Sam', 'Brown', 3000), ('Paul', 'Ins', 4200), ('Victor', 'Baya', 2800), ('Mark', 'Adams', 2500), ('Tim', 'Cook', 2800); INSERT INTO Employees(FirstName, LastName) VALUES ('Homer', 'Simpson'), ('Tom', 'Smith'), ('Mark', 'Adams'), ('Nick', 'Svensson');
Таблица Employees содержит данные обо всех сотрудниках банка, а таблица Customers - обо всех клиентах. Но сотрудники банка могут также быть его клиентами. И допустим, нам надо найти всех клиентов банка, которые не являются его сотрудниками:
SELECT FirstName, LastName FROM Customers EXCEPT SELECT FirstName, LastName FROM Employees;
Подобным образом можно получить всех сотрудников банка, которые не являются его клиентами:
SELECT FirstName, LastName FROM Employees EXCEPT SELECT FirstName, LastName FROM Customers;