结合OUTER JOIN和WHERE

时间:2009-09-28 13:21:55

标签: sql mysql

我正在尝试从数据库中获取一些数据。 我想选择一名员工,如果有的话,选择与该员工相关的所有约会和其他数据。

这是查询:

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。我不能来这里的是什么?

编辑: 为清楚起见,我删除了一些柱子。我删了太多了。至少应该显示TEI.displayname。

4 个答案:

答案 0 :(得分:3)

查看查询返回的列列表,您会发现它们都来自LEFT OUTER JOIN的“右侧”。您不包括联接“左”侧的任何列。因此,预期的结果是您正在观察的结果 - 为没有返回右侧行的那些行的结果集中的所有右侧列提供了NULL值。

要查看这些行的数据,请在结果集中包含TE(tblemployee)中的一些列。

查看您的查询我猜测情况有点复杂,并且连接右侧的某些表应该移到左侧,此外,还有一些其他表可能需要自己的OUTER连接才能正确参与查询。

编辑回复提问者的评论:

您有一个奇怪的情况(可能不是奇怪的,取决于您的申请),您有一个员工表和一个单独的员工信息(employeeinfo)表。

因为您将employeeinfo加入到具有INNER联接的约会表中,您可以根据它们对最终结果集的贡献来有效地将它们视为单个表。因为这个组合表需要约会表中的记录,并且因为这个组合表通过LEFT OUTER连接连接到主结果集,所以效果是如果没有约会将employeeinfo记录链接到,则找不到employeeinfo记录。

如果您将employeeinfo表移动到联接的左侧,或者使用employeeinfo表替换employee表,您应该得到所需的结果。

答案 1 :(得分:1)

在你的查询中,你将LETER 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

答案 2 :(得分:0)

查询正在按预期执行。

一个遗漏连接将从一个表中选择所有记录,将它们与另一个表中的记录连接起来,并产生空值,其中第二个表中没有找到与连接条件匹配的记录。

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

答案 3 :(得分:0)

问题在于你加入的方式(大部分都是加入你的左外连接表)每当你加入时,如果外连接表中的值什么都没有,那就什么都没有了其他字段加入。尝试重新调整您的查询,以便所有内容都加入您的employeeID。我通常在使用内部连接限制所有内容之后使用左连接表。

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

选择     TA.id, TEI.displayname, TA.threatment_id, TTS.appointment_date 从 tblemployee AS TE INNER加入tblemployeeinfo AS TEI ON TEI.employeeinfoid = TE.employeeinfoid 内部联接tblthreatment AS T ON TA.threatment_id = T.threatmentid 内部联接tblappointments AS TTS ON TTS.id = TA.appointments_id AND         TTS.appointment_date ='2009-09-28' Inner Join tblcustomercard AS TCC ON TCC.customercardid = TTS.customercard_id LEFT OUTER加入tblappointment AS TA ON TE.employeeid = TA.employee_id 哪里     TE.employeeid = 4

最后一个外部联接只给我一列信息,而不是全部用来加入更多内容。对于速度,您还希望尝试使用前几个内部联接尽可能快地限制信息,然后最后执行外部联接以将可能的空值连接到最小的数据集。我希望这会有所帮助,如果它令人困惑,我很抱歉......我还没有咖啡因。