Условие
В таблице A всего 1 строка, в таблице B — 10 строк. Какие соединения могут вернуть меньше 10 строк?
- A)
A LEFT JOIN B - B)
A RIGHT JOIN B - C)
A INNER JOIN B - D)
A CROSS JOIN B
Задание засчитывается, если все варианты выбраны правильно.
Решение
Менее 10 строк могут вернуть: A и C.
| Соединение | Минимум строк | Максимум строк |
|---|---|---|
A LEFT JOIN B |
1 (если совпадений нет, остаётся 1 строка A с NULL справа) |
10 (если все строки B матчатся с A) |
A RIGHT JOIN B |
10 (все строки B всегда в результате) | 10 |
A INNER JOIN B |
0 (если нет совпадений) | 10 (если все B матчатся с A) |
A CROSS JOIN B |
10 (всегда 1 × 10 = 10) |
10 |
Почему так
- LEFT JOIN A → B. Все строки
Aостаются. Если ни одна строкаBне сматчилась → результат = 1 строка (сNULLв правой части). При совпадениях — до 10 строк. - RIGHT JOIN A → B. Все строки
Bостаются. Минимум = 10 (несовпавшие пойдут сNULLслева). - INNER JOIN. Только пересечение. Если нет общих ключей — 0 строк. Иначе ≤ 10.
- CROSS JOIN. Декартово произведение
1 × 10 = 10. Никаких условий, всегда ровно 10.
Граничные примеры
-- A INNER JOIN B без совпадений: 0 строк
SELECT * FROM A JOIN B ON A.id = B.id WHERE A.id NOT IN (SELECT id FROM B);
-- A LEFT JOIN B без совпадений: 1 строка
SELECT * FROM A LEFT JOIN B ON FALSE;Подводные камни
- Считать, что
LEFT JOINвсегда = размер левой таблицы. Это верно только при join-е 1:1 (или 1:0). При совпадении одной строки A с несколькими B результат раздувается. - Путать
INNERсCROSS.INNER JOIN ... ON TRUE≡CROSS JOIN. БезONINNER JOINсинтаксически некорректен. RIGHT JOINпротивLEFT JOIN. Симметричны:A RIGHT JOIN B=B LEFT JOIN A(по строкам — те же).
Эталонный ответ
A, C. LEFT JOIN (минимум 1 строка) и INNER JOIN (минимум 0) могут дать меньше 10. RIGHT JOIN всегда ≥ 10, CROSS JOIN всегда ровно 10.