ПРИСОЕДИНЯЙТЕСЬ к трем столам - PullRequest
16 голосов
/ 12 июля 2010

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

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

SELECT A. * FROM TableA A

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

ПРИСОЕДИНИТЬСЯ к таблице C ВКЛ (A.id = C.a_id)

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

Ответы [ 2 ]

20 голосов
/ 12 июля 2010

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

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
9 голосов
/ 12 июля 2010

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