2009-09-28 63 views
1

我试图从数据库中获取一些数据。 我想选择一名员工,并且如果有的话,可以选择与该员工相关的所有约会和其他数据。组合OUTER JOIN和WHERE

这是查询:

SELECT 
TA.id, 
TEI.displayname, 
TA.threatment_id, 
TTS.appointment_date, 
     TEI.displayname 
    FROM 
tblemployee AS TE 
LEFT OUTER Join tblappointment AS TA ON TE.employeeid = TA.employee_id 
Inner Join tblthreatment AS T ON TA.threatment_id = T.threatmentid 
Inner Join tblappointments AS TTS ON TTS.id = TA.appointments_id AND 
      TTS.appointment_date = '2009-09-28' 
     INNER Join tblemployeeinfo AS TEI ON TEI.employeeinfoid = TE.employeeinfoid 
     Inner Join tblcustomercard AS TCC ON TCC.customercardid = TTS.customercard_id 
    WHERE 
    TE.employeeid = 4 

的问题是,它只是在没有预约返回null选择的所有字段。我不在这里?

编辑: 对于clearity,我删除了一些collumns的。我删除了太多。至少应显示TEI.displayname。在您的查询返回的列清单

+1

如果您不期望为零,您期望什么? – Natrium 2009-09-28 13:25:36

+0

我应该更清楚。它显示所有字段为空(包括员工)。它至少应该给员工。 – Ikke 2009-09-28 13:49:10

回答

3

看,你会发现,他们都来自LEFT OUTER的“右”侧JOIN。您不包含连接“左侧”的任何列。因此,预期的结果就是您正在观察的结果 - 为返回没有右手行的行的结果集中的所有右列提供NULL值。

要查看即使是那些行的数据,也要在结果集中包含来自TE(tblemployee)的一些列。

看着你的查询我猜测情况有点复杂,连接右侧的一些表应该移动到左侧,而且,一些的其他表可能需要他们自己的OUTER连接才能正确参与查询。

编辑瓦特/回应提问的评论:

您有一个奇怪的情况(也许不是奇可言,这取决于你的应用程序)中,你有一个雇员表和一个独立的员工信息(employeeinfo)表。

因为你是用内侧连接的employeeinfo到预约表连接,你可以有效地把它们看成一个单一的表,他们对最终的结果集如何促进条款。由于此组合表需要在约会表中记录,并且由于此组合表使用LEFT OUTER联合连接到主结果集,因此,如果没有指定联系人的雇员信息,则不会找到employeeinfo记录。

如果将employeeinfo表的加入,或更换职员表瓦特/ employeeinfo表的左侧,你应该得到你想要的结果。

+0

谢谢。在预约表解决问题后,外部加入所有表格。你能解释为什么在tblappointment之后的其余表格上的OUTER JOIN是需要的吗? – Ikke 2009-09-28 14:06:08

+0

我把我的回答放在上面的正文中,因为评论太长了。 – 2009-09-28 14:29:34

0

该查询正在执行,因为它应该。

一个离开了加盟将一个表中选择的所有记录,与另一个记录加入他们的行列,并产生其中在第二个表中没有记录发现零点符合加入条件。

如果您正在寻找单独的行为,您可能需要考虑两个单独的查询。

0

的问题是,你所参加的方式(大部分都被加入到你的左外连接表),只要您参加过的,如果在外部连接表的值是什么,有没有其他领域加入。尝试重新调整您的查询,以便所有内容都与您的员工ID结合起来。我通常使用左连接的表格,尽量限制内部连接。

所以我的查询会是这样的:

选择 TA.id, TEI.displayname, TA.threatment_id, TTS.appointment_date FROM tblemployee AS TE INNER JOIN tblemployeeinfo AS TEI ON TEI .employeeinfoid = TE.employeeinfoid 内部联接tblthreatment AS T ON TA.threatment_id = T.threatmentid 内部联接tblappointments AS ON TTS.id = TA.appointments_id AND TTS.appointment_date = '2009-09-28' 内部联接TTS tblcustomerc ARD AS TCC ON TCC.customercardid = TTS.customercard_id LEFT OUTER JOIN tblappointment AS TA ON TE.employeeid = TA.employee_id WHERE TE.employeeid = 4

其中最后一个外部联接只是给我的一个价值信息,而不是全部使用它来加入更多的东西。为了提高速度,您还需要尝试尽可能快地限制您的信息与前几个内部联接,然后外部联接最后将可能的空值联接到最小的数据集上。我希望这有助于,如果它很混乱,我很抱歉...我还没有喝过咖啡因。

1

在您的查询中,您将LEFT OUTER JOIN加入到tblappointment表中,但随后您将INNER JOIN加入到tblthreatment和tblappointments表中。

您应该尝试按照您希望数据存在的顺序来组织您的查询。然后在大多数简单的查询中,一旦你执行了一个OUTER连接,那么大多数表将成为一个OUTER连接。这是没有意义的规则和复杂的查询可能会有所不同,但在简单查询的大多数情况下,这是一个很好的做法。

为您的查询尝试这样的事情。

SELECT 
    TA.id, 
    TEI.displayname, 
    TA.threatment_id, 
    TTS.appointment_date 
FROM 
    tblemployee AS TE 
INNER Join 
    tblemployeeinfo AS TEI 
ON 
    TEI.employeeinfoid = TE.employeeinfoid 
LEFT OUTER Join 
    tblappointment AS TA 
ON 
    TE.employeeid = TA.employee_id 
LEFT OUTER JOIN 
    tblthreatment AS T 
ON 
    TA.threatment_id = T.threatmentid 
LEFT OUTER JOIN 
    tblappointments AS TTS 
ON 
    TTS.id = TA.appointments_id 
AND 
    TTS.appointment_date = '2009-09-28' 
LEFT OUTER JOIN 
    tblcustomercard AS TCC 
ON 
    TCC.customercardid = TTS.customercard_id 
WHERE 
    TE.employeeid = 4 
+0

这个查询的大部分都是自动生成的,我没有费心去构造它。 – Ikke 2009-09-28 13:59:56