SQL中的多个连接

时间:2011-12-07 21:57:54

标签: sql-server sql-server-2008 tsql

我正在尝试将多个表连接到表中的相同值。所以我有表ActivityPartyBase,它有一个PartyId列。我想将ContactBase表中的COntactId和AccountBase表中的PartyId和AccountId连接到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 个答案:

答案 0 :(得分:3)

鉴于此......

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

答案 1 :(得分:3)

您的内部联接正在过滤掉结果,因为联接表上没有相应的记录。我总是发现最简单的调试方法是选择*"并使用所有LEFT JOIN。这将显示表格中与主表相关的所有内容;你应该能够查看你的数据并找出那个表格在那时很容易丢失的记录。

要确认这只是命名约定不匹配,

INNER JOIN AccountBase ON ActivityPartyBase.PartyId = AccountBase.AccountId

PartyID和AccountId是PK / FK吗?

答案 2 :(得分:0)

您确定内部联接中的所有三个表中都有数据吗?

答案 3 :(得分:0)

我猜你的一个INNER JOIN没有拿起任何数据。从所有3个连接开始,然后一次取出其中一个连接,看看哪个连接断开了。然后查看您的连接条件,看看哪个列没有返回记录。

答案 4 :(得分:0)

对我而言,好像这些表是相互排斥的。如果它是离子表,则不是其他(设计不佳)。尝试左连接到两个表。