Присоединяйтесь к трем столам

Я пытаюсь получить два набора информации (красная и синяя части диаграммы в одном запросе.

Я думал, что смогу сделать это, используя sql, как указано ниже, но он ничего мне не возвращает, если TableC не имеет записей. Если TableC не имеет записей, я все равно хочу, чтобы этот запрос возвращал мне результаты, как указано в области BLUE.

SELECT A. * FROM TableA A

ПРИСОЕДИНЯЙТЕСЬ В таблице B B ON (A.id = B.a_id)

JOIN TableC C ON (A.id = C.a_id)

Оцените любые указатели, чтобы вернуть мне красный и/или синий сегменты. Спасибо заранее =]

Ответы

Ответ 1

попробуйте что-то вроде этого

SELECT A.* FROM TableA A
LEFT OUTER JOIN TableB B ON (A.id = B.a_id)
LEFT OUTER JOIN TableC C ON (A.id = C.a_id)
WHERE B.a_id IS NOT NULL 
  OR c.a_id IS NOT NULL

Ответ 2

Чтобы понять, почему вы не получаете никаких результатов, когда 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

Edit

Следуя той же логике, если вы хотите иметь все строки из 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