Чтобы понять, почему вы не получаете никаких результатов, когда TableC
не имеет записей, вам нужно немного узнать о типах JOIN в SQL.
Обычно, когда вы выполняете запрос
TableA A JOIN TableB B ON A.id = B.a_id
вы говорите базе данных, чтобы она смотрела на TableA
и TableB
и выбирала все пары строк, которые удовлетворяют предикату соединения (A.id = B.a_id).Поэтому, если TableB
пусто, база данных не может найти и пара строк с вышеупомянутыми критериями.
Этот тип JOIN называется INNER JOIN и это наиболее распространенный тип операции объединения.
В вашем случае вы хотите получить все строки из TableA X TableB
и все соответствующие строки из TableC
, если такие строки существуют (на основе предиката соединения "A.id = C.a_id". Это относится к OUTER JOIN . Два наиболее распространенных типа такого объединения - это LEFT JOIN (который включает в себя все строки из левой таблицы) и RIGHT JOIN (который включает в себя все строки из правой таблицы).
В этом случае ваш запрос должен быть:
SELECT A.*
FROM
(TableA A JOIN Table B B ON A.id = B.a_id)
LEFT JOIN TableC C ON A.id = C.a_ID
Я быПредлагаем взглянуть на соответствующую страницу Википедии , если вы хотите узнать больше о типах объединений в SQL
Редактировать
Следуя следующимта же логика, если вы хотите иметь все строки из TableA
и только соответствующие строки из таблиц TableB
и TableC
(если они существуют), ваш запрос будет выглядеть так:
SELECT A.*
FROM
(TableA A LEFT JOIN Table B B ON A.id = B.a_id)
LEFT JOIN TableC C ON A.id = C.a_ID