Внешнее соединение таблиц SQL? - PullRequest
1 голос
/ 21 февраля 2012

У меня есть три таблицы в базе данных -

  1. Таблица активности с идентификатором_действия, тип_действия
  2. Таблица категорий с идентификатором категории, именем категории
  3. Таблица ссылок с отображением между activity_id и category_id

Мне нужно написать оператор выбора, чтобы получить следующие данные:

activity_id, activity_type, Category_name.

Проблема в том, что некоторые из activity_id не имеют записи в таблице ссылок.

Если я напишу:

select a.activity_id, a.activity_type, c.category_name 
from activity a, category c, link l 
where a.activity_id = l.activity_id and c.category_id = l.category_id

тогда я не получаю данные для activity_ids, которых нет в таблице ссылок. Мне нужно получить данные для всех действий с пустым или нулевым значением в качестве category_name для тех, у которых нет ссылок на category_id.

Пожалуйста, помогите мне с этим.

PS. Я использую MS SQL Server DB

Ответы [ 4 ]

2 голосов
/ 21 февраля 2012

Вы должны использовать правильные явные объединения:

select a.activity_id, a.activity_type, c.category_name 
from activity a
LEFT JOIN link l 
ON a.activity_id = l.activity_id 
LEFT JOIN category c
ON l.category_id = c.category_id
2 голосов
/ 21 февраля 2012

Я полагаю, вы ищете LEFT OUTER JOIN для вашей таблицы активности, чтобы вернуть все строки.

SELECT
a.activity_id, a.activity_type, c.category_name 
FROM activity a
LEFT OUTER JOIN link l 
ON a.activity_id = l.activity_id
LEFT OUTER JOIN category c
ON c.category_id = l.category_id; 
1 голос
/ 21 февраля 2012

Если написание этого типа логики будет частью ваших текущих обязанностей, я настоятельно рекомендую вам провести некоторое исследование по объединениям, включая взаимодействие между объединениями и предложения where. Объединения и где предложения объединяются, чтобы сформировать основу написания запроса, независимо от технологии, используемой для извлечения данных.

Наиболее важная информация о присоединении для понимания:

  • Left Outer Join: извлекает всю информацию из «левой» таблицы и любые записи, которые существуют в объединенной таблице
  • Inner Join: извлекает только те записи, которые существуют в обеих таблицах
  • Где предложения: используется для ограничения данных, независимо от определения внутреннего или внешнего объединения.

В примере, который вы опубликовали, предложение where ограничивает ваши общие данные строками, которые существуют во всех 3 таблицах. Замена предложения where соответствующей логикой соединения поможет:

select a.activity_id, a.activity_type, c.category_name 
from activity a 
     left outer join link l --return all activity rows regardless of whether the link exists 
          on a.activity_id = l.activity_id
left outer join category c --return all activity rows regardless of whether the link exists  
          on c.category_id = l.category_id

Удачи!

0 голосов
/ 21 февраля 2012

А как же?

 select a.activity_id, a.activity_type, c.category_name  from category c
 left join link l on c.category_id = l.category_id
 left join activity a on l.activity_id = a.activity_id

На самом деле, первое соединение кажется, что это может быть inner join, потому что вы не упомянули, что там могут быть некоторые отсутствующие элементы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...