Выражение EXCEPT

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

Чтобы можно было вычислить разницу для двух запросов, эти запросы должны быть совместимыми. Это означает, что они должны иметь одинаковое число столбцов и соответствующие столбцы должны быть совместимых типов.

Синтаксис

SELECT ...
EXCEPT
SELECT ...

Примеры

  • Выведем список стран, которые встречаются в столбце country в таблице столиц, но не встречаются в одноименном столбце в таблице количества населения:

    CREATE TABLE capitals (country VARCHAR, capital VARCHAR);
    CREATE TABLE population (country VARCHAR, population_mil BIGINT);
    
    INSERT INTO capitals VALUES
        ('Russia', 'Moscow'),
        ('Italy', 'Rome'),
        ('Spain', 'Madrid'),
        ('France', 'Paris');
    INSERT INTO population VALUES
        ('Russia', 143),
        ('Spain', 48),
        ('Brazil', 211);
    
    SELECT country FROM capitals
    EXCEPT
    SELECT country FROM population;
    +---------+
    | country |
    +---------+
    | France  |
    +---------+
    | Italy   |
    +---------+
  • Теперь попробуем вычислить разницу двух запросов с разными наборами столбцов:

    CREATE TABLE capitals (country VARCHAR, capital VARCHAR);
    CREATE TABLE population (country VARCHAR, population_mil BIGINT);
    
    INSERT INTO capitals VALUES
        ('Russia', 'Moscow'),
        ('Italy', 'Rome'),
        ('Spain', 'Madrid'),
        ('France', 'Paris');
    INSERT INTO population VALUES
        ('Russia', 143),
        ('Spain', 48),
        ('Brazil', 211);
    
    SELECT country, capital FROM capitals -- Error expected
    EXCEPT
    SELECT country FROM population;
    ERROR: BinderException: Binder Error:
    Set operations can only apply to expressions with the same number of result columns

Мы получили ошибку, так как запросы не являются совместимыми для вычисления разницы — в них заданы разные наборы столбцов.