Ответ 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
Я пытаюсь получить два набора информации (красная и синяя части диаграммы в одном запросе.
Я думал, что смогу сделать это, используя 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)
Оцените любые указатели, чтобы вернуть мне красный и/или синий сегменты. Спасибо заранее =]
попробуйте что-то вроде этого
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
Чтобы понять, почему вы не получаете никаких результатов, когда 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