2016-01-11 2 views
1

У меня есть две таблицы: Компания и Контакт, с отношениями один-ко-многим. У меня есть другой стол Трек, который идентифицирует некоторые компании как материнские компании для других компаний. enter image description hereВыберите отдельную запись со списком записей соединения

Я хочу написать SQL-запрос, который выбирает материнские компании из Track и количество контактов, которое имеет каждый родитель.

SELECT Track.ParentId, Count(Contact.companyId) 
FROM Track  
    INNER JOIN Contact 
    ON Track.ParentId = Contact.companyId 
GROUP BY Track.ParentId 

однако результат имеет меньше записей, чем когда я запускаю следующий запрос:

SELECT DISTINCT Track.ParentId 
FROM Track 

Я попробовал первый запрос с добавлением DISTINCT и он вернулся те же результаты (меньше, что это предназначалось к).

ответ

4

Выполняется INNER JOIN с таблицей контактов, что означает, что любые строки из первой таблицы (дорожка в этом случае), не совпадающие с таблицей JOIN, не будут отображаться в результатах. Вместо этого попробуйте использовать LEFT OUTER JOIN.

COUNT с Contact.companyId будет считать только строки, где есть совпадение (Contact.companyId не NULL). Поскольку вы считаете, что контакты прекрасны, поскольку они будут считаться 0. Если вы пытались подсчитать некоторый другой набор данных и пытались сделать COUNT в определенном столбце (а не COUNT(*)), то любые значения NULL в этом столбце не будут рассчитывайте на свое общее количество, которое может быть или не быть тем, что вы хотите.

+1

Выглядит неплохо, кроме того, если rosa хочет 0 или нулевой счет, возможно, потребуется скорректировать счет, используя каменноугольный или случайный или isnull или другие варианты, чтобы вернуть 0 вместо нуля. возможно, 'coalesce (count (contact.companyID)) как cnt' – xQbert

+0

Да, в зависимости от того, какие конкретные требования могут потребоваться. Хорошая точка зрения. –

+0

Я не могу использовать левое внешнее соединение, потому что я использую доступ, но ответ, который я нашел, схож. Благодарю. – MJH

0

Я использовал INNER JOIN, который возвращает только те записи, которые идентичны в обеих таблицах.

Чтобы вернуть все записей из таблицы дорожек и записей, которые соответствуют таблице контактов, мне нужно использовать LEFT JOIN.

Смежные вопросы