Несколько соединений в TSQL - PullRequest
0 голосов
/ 08 декабря 2011

Я пытаюсь присоединить несколько таблиц к одному значению в таблице. Итак, у меня есть таблица ActivityPartyBase, и у нее есть столбец PartyId. Я хочу присоединить COntactId в таблице ContactBase к PartyId и AccountId в таблице AccountBase к PartyId. Это код, который я использую, и он ничего не возвращает. Если я только присоединюсь к одному, это работает. Есть идеи?

SELECT DISTINCT Appointment.ScheduledStart, ActivityPartyBase.ActivityId
   , Appointment.ActivityId AS Expr1, ActivityPartyBase.ScheduledStart AS Expr2
   , Appointment.Subject, ActivityPartyBase.PartyId, ContactBase.ContactId
   , ContactBase.FullName
FROM Appointment
INNER JOIN ActivityPartyBase
   ON Appointment.ActivityId = ActivityPartyBase.ActivityId
INNER JOIN AccountBase ON ActivityPartyBase.PartyId = AccountBase.AccountId
LEFT OUTER JOIN ContactBase ON ActivityPartyBase.PartyId = ContactBase.ContactId
ORDER BY Appointment.ScheduledStart DESC

Ответы [ 5 ]

3 голосов
/ 08 декабря 2011

Ваши внутренние объединения отфильтровывают результаты, потому что в объединенной таблице нет соответствующей записи.Я всегда находил, что самый простой способ отладки - это «Выбрать *» и использовать все ЛЕВЫЕ СОЕДИНЕНИЯ.Это покажет вам все в ваших таблицах, что относится к вашему основному столу;Вы должны быть в состоянии посмотреть на свои данные и выяснить, в какой таблице в данный момент отсутствует запись.

Чтобы подтвердить, что это просто несоответствие соглашения по присвоению имен,

INNER JOIN AccountBase ON ActivityPartyBase.PartyId = AccountBase.AccountId

PartyID и AccountId PK / FK?

3 голосов
/ 08 декабря 2011

Учитывая это ...

FROM Appointment 
   INNER JOIN ActivityPartyBase ON Appointment.ActivityId = ActivityPartyBase.ActivityId 
   INNER JOIN AccountBase ON ActivityPartyBase.PartyId = AccountBase.AccountId 
   LEFT OUTER JOIN ContactBase ON ActivityPartyBase.PartyId = ContactBase.ContactId

... вы утверждаете, что это работает (?) ...

FROM Appointment 
   INNER JOIN ActivityPartyBase ON Appointment.ActivityId = ActivityPartyBase.ActivityId 
   /* INNER JOIN AccountBase ON ActivityPartyBase.PartyId = AccountBase.AccountId */
   /* LEFT OUTER JOIN ContactBase ON ActivityPartyBase.PartyId = ContactBase.ContactId */

Поскольку LEFT OUTER JOIN явно не приведет к результатам, это не будет вашей проблемой. Поскольку INNER JOIN вызовет то, что вы видите, мы можем только сделать вывод, что условие соединения неверно.

Другими словами, ActivityPartyBase.PartyId не равен AccountBase.AccountID.

0 голосов
/ 08 декабря 2011

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

0 голосов
/ 08 декабря 2011

Полагаю, одно из ваших ВНУТРЕННИХ СОЕДИНЕНИЙ не собирает никаких данных. Начните со всех 3 объединений, затем выньте одно из объединений за раз, посмотрите, какое из них нарушает его. Затем посмотрите на условия соединения и посмотрите, какой столбец не возвращает запись.

0 голосов
/ 08 декабря 2011

Вы уверены, что есть данные во всех трех таблицах во внутреннем объединении?

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