Собесов

Какого типа JOIN не существует в PostgreSQL

SQLJOINЛёгкаяJunior

Условие

Какого типа JOIN не существует в PostgreSQL?

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN
  • CROSS JOIN
  • UPPER JOIN

Решение

Несуществующий — UPPER JOIN (такого оператора нет ни в стандарте SQL, ни в одной СУБД). Это вопрос-проверка на внимательность.

Существующие в PostgreSQL JOIN'ы

Тип Что делает Синоним
INNER JOIN Только совпадения JOIN
LEFT [OUTER] JOIN Все из левой + совпадения справа LEFT JOIN
RIGHT [OUTER] JOIN Все из правой + совпадения слева RIGHT JOIN
FULL [OUTER] JOIN Все строки обеих сторон
CROSS JOIN Декартово произведение Через ,
LATERAL JOIN Подзапрос видит колонки слева
NATURAL JOIN По колонкам с одинаковыми именами (не рекомендуется)
SELF JOIN Не тип, а способ — JOIN таблицы с самой собой
SEMI JOIN Не явный — реализуется через EXISTS
ANTI JOIN Не явный — NOT EXISTS / LEFT JOIN ... IS NULL

LATERAL JOIN — менее известный

Подзапрос справа может ссылаться на колонки слева:

SELECT u.id, top_orders.*
FROM   users u,
LATERAL (
  SELECT * FROM orders o
  WHERE  o.user_id = u.id    -- ссылка на u.id
  ORDER BY total DESC
  LIMIT  3
) top_orders;

Такого нет в MySQL до 8.0.14 (там LATERAL через подзапросы).

NATURAL JOIN — почему избегают

SELECT * FROM a NATURAL JOIN b;
-- неявно соединит по всем общим именам колонок

Опасно: если в обеих таблицах добавили колонку с одинаковым именем, JOIN молча изменит поведение. Используйте JOIN ... USING (col) или JOIN ... ON.

Подводные камни

  1. SEMI JOIN и ANTI JOIN — это термины из теории, в SQL пишутся через EXISTS/NOT EXISTS.
  2. OUTER в LEFT/RIGHT/FULL — необязательное ключевое слово; LEFT JOIN = LEFT OUTER JOIN.
  3. UPPER JOIN — не существует; вопрос на внимательность.
  4. STRAIGHT_JOIN — есть в MySQL (форсит порядок), нет в PostgreSQL.

Эталонный ответ

UPPER JOIN — такого оператора в SQL не существует. В PostgreSQL есть: INNER, LEFT, RIGHT, FULL OUTER, CROSS, LATERAL, NATURAL.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти