Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并外部联接和WHERE_Sql_Mysql - Fatal编程技术网

Sql 合并外部联接和WHERE

Sql 合并外部联接和WHERE,sql,mysql,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.emplo

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

以下是查询:

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。

查看查询返回的列列表,您会注意到它们都来自左侧外部联接的“右侧”。不包括联接“左侧”的任何列。因此,预期结果就是您正在观察的结果—为结果集中没有返回右侧行的行的所有右侧列提供空值

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

查看您的查询,我猜情况要复杂一些,连接右侧的一些表应该移到左侧,而且,其他一些表可能需要它们自己的外部连接才能正确地参与查询

编辑了对提问者评论的回复:

您有一个奇怪的情况(可能一点也不奇怪,取决于您的应用程序),其中有一个employee表和一个单独的employeeinfo表

由于您使用内部联接将employeeinfo联接到Appoints表,因此您可以根据它们对最终结果集的贡献将它们有效地看作一个表。由于此组合表需要“约会”表中的一条记录,并且此组合表通过左外部联接连接到主结果集中,因此如果没有要链接的约会,则不会找到employeeinfo记录


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

查看查询返回的列列表,您会注意到它们都来自左侧外部联接的“右侧”。不包括联接“左侧”的任何列。因此,预期结果就是您正在观察的结果—为结果集中没有返回右侧行的行的所有右侧列提供空值

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

查看您的查询,我猜情况要复杂一些,连接右侧的一些表应该移到左侧,而且,其他一些表可能需要它们自己的外部连接才能正确地参与查询

编辑了对提问者评论的回复:

您有一个奇怪的情况(可能一点也不奇怪,取决于您的应用程序),其中有一个employee表和一个单独的employeeinfo表

由于您使用内部联接将employeeinfo联接到Appoints表,因此您可以根据它们对最终结果集的贡献将它们有效地看作一个表。由于此组合表需要“约会”表中的一条记录,并且此组合表通过左外部联接连接到主结果集中,因此如果没有要链接的约会,则不会找到employeeinfo记录


如果将employeeinfo表移动到联接的左侧,或将employeeinfo表替换为employee表,则应该会得到所需的结果。

查询正在按应有的方式执行

遗漏联接将从一个表中选择所有记录,将它们与另一个表中的记录联接,并在第二个表中找不到与联接条件匹配的记录时生成空值


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

该查询正在按应有的方式执行

遗漏联接将从一个表中选择所有记录,将它们与另一个表中的记录联接,并在第二个表中找不到与联接条件匹配的记录时生成空值


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

问题是,无论何时连接,连接的方式(大部分都是连接到左侧外部连接表)都是如此,如果外部连接表中的值为空,则其他字段都无法连接。尝试重新调整您的查询,以便所有内容都与您的employeeID相关联。在使用内部联接尽可能地限制所有内容之后,我通常使用左联接表

所以我的问题是这样的:

挑选 助教, TEI.displayname, TA.Threation_id, 约会日期 从…起 被雇佣者 在TEI.employeeinfoid=TE.employeeinfoid上作为TEI的内部联接tblemployeeinfo 内部连接TBLTreaction作为TA上的T.Threation_id=T.threatmentid 作为TTS上的TTS的内部联接TBLAPPoints.id=TA.u id和 TTS.任命日期='2009-09-28' 在TCC.customercardid=TTS.customercard\U id上将TBL客户卡作为TCC内部连接 TE.employeeid=TA.employee\U id上的左外连接TBLAppoint作为TA 哪里 TE.employeeid=4


最后一个外部连接只给了我一列信息,而不是全部用来连接更多的东西。为了提高速度,您还希望尝试使用前几个内部联接尽可能快地限制信息,然后最后执行外部联接,以便将可能的空值联接到最小的数据集上。我希望这能有所帮助,如果让人困惑,我很抱歉。。。我还没有喝过咖啡因。

问题是你加入的方式(大多数人都是
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