我正在尝试从数据库中获取一些数据。 我想选择一名员工,如果有的话,选择与该员工相关的所有约会和其他数据。
这是查询:
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。
答案 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
最后一个外部联接只给我一列信息,而不是全部用来加入更多内容。对于速度,您还希望尝试使用前几个内部联接尽可能快地限制信息,然后最后执行外部联接以将可能的空值连接到最小的数据集。我希望这会有所帮助,如果它令人困惑,我很抱歉......我还没有咖啡因。