У меня есть две таблицы, и я хочу запросить 2 таблицы, чтобы получить отчет.
POSITION
+-------------+---------------+
| position_id | position_name |
+-------------+---------------+
| 1 | E1P1 |
| 2 | E1P2 |
| 3 | E3P3 |
| 4 | E4P4 |
+-------------+---------------+
PEOPLE
+------------+-------------+--------------------+
| people_id | people_name | people_position_id |
+------------+-------------+--------------------+
| 1 | JOHN | 2 |
| 2 | MARK | 4 |
+------------+-------------+--------------------+
ЗАПРОС
SELECT position_id, position_name, people_name FROM position
RIGHT JOIN people ON people_position_id = position_id
Когда я использую простой запрос, я получаю только совпадающие строки, как получить все?
Я хотел бы получить этот результат
+----+----------+--------+
| ID | POSITION | STATUS |
+----+----------+--------+
| 1 | E1P1 | Empty |
| 2 | E1P2 | JOHN |
| 3 | E3P3 | Empty |
| 4 | E4P4 | MARK |
+----+----------+--------+






Я бы использовал здесь левое соединение:
SELECT
po.position_id,
po.position_name,
COALESCE(pe.people_name, 'EMPTY') AS STATUS
FROM position po
LEFT JOIN people pe
ON po.position_id = pe.people_position_id;
Кстати, причина, по которой ваша текущая попытка правильного соединения не удалась, заключается в том, что вы разместили таблицу people с правой стороны соединения. Это означает, что записи о несовпадающих позициях будут отброшены. Вот мой ответ выше, переписанный с использованием правильного соединения:
SELECT
po.position_id,
po.position_name,
COALESCE(pe.people_name, 'EMPTY') AS STATUS
FROM people pe
RIGHT JOIN position po
ON po.position_id = pe.people_position_id;
Обратите внимание, что порядок столов изменился. В большинстве случаев вы увидите людей, использующих левое соединение, а не правое.
Попробуйте добавить индекс к
people, например.CREATE INDEX idx ON people (people_position_id, people_name). Уже одно это должно немного ускорить процесс.