В чем разница cross join и right join
Что проверяют
Понимаете ли вы, сколько строк вернёт запрос и откуда в результате берутся NULL. Тестировщику это нужно для проверочных запросов к базе, поэтому следом часто просят найти записи без пары или объяснить, почему отчёт внезапно показал дубли.
Как отвечать
CROSS JOIN: декартово произведение, каждая строка первой таблицы с каждой строкой второй. Условия соединения нет, строк в результатеN × M: 3 браузера и 4 ОС дают 12 комбинаций. То же самое получается записьюFROM a, bбез условия вWHERE;RIGHT JOIN: все строки правой таблицы плюс подходящие строки левой по условию вON. Если пары нет, колонки левой таблицы заполняютсяNULL. Строк не меньше, чем в правой таблице, и больше, если одной правой строке подходят несколько левых.
RIGHT JOIN это зеркальный LEFT JOIN: a RIGHT JOIN b даёт то же, что b LEFT JOIN a. На практике чаще пишут LEFT JOIN, так запрос читается слева направо. В SQLite RIGHT JOIN вообще появился только в версии 3.39.
Где это пригодится тестировщику:
- поиск «сирот»:
SELECT o.* FROM users u RIGHT JOIN orders o ON o.user_id = u.id WHERE u.id IS NULLнайдёт заказы без пользователя. Хорошая проверка целостности после миграции данных; - матрица тестовых данных:
CROSS JOINтаблиц ролей и статусов генерирует все сочетания для параметризованных тестов; - разбор бага с дублями: если в запросе отчёта потеряли условие соединения, получилось случайное декартово произведение, и суммы выросли в разы.
Где спотыкаются
Ставят условие на левую таблицу в WHERE, например WHERE u.status = 'active'. Строки с NULL отсекаются, и RIGHT JOIN молча превращается во внутреннее соединение. Такое условие переносят в ON.
Уверены, что RIGHT JOIN возвращает ровно столько строк, сколько в правой таблице. При нескольких совпадениях строк больше.
Запускают CROSS JOIN на больших таблицах «посмотреть». Две таблицы по 100 тысяч строк дают 10 миллиардов строк в результате.