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