我需要帮助构建一个返回父记录的查询(来自Meeting表),无论子记录是否存在(来自ActionItems表)。我能够通过LEFT JOIN执行此操作,但是一旦我添加了其他关联表(成员和类别),代码将无法正常工作。
这是我的表的结构:
我需要显示每次会议的信息
在ActionItems表中,CategoryId字段可能为空白,即使CategoryId为空,我也需要显示ActioItem
会议可能没有与之关联的任何操作项,即使没有ActionItems也需要返回会议记录
这是我的代码不起作用(我可能需要进行多次查询,这很好):
SELECT Members.FirtName
, Members.LastName
, Meeting.Notes
, Meeting.Location
, ActionItems.Details
, ActionItems.CompleteByDate
, Category.Name
FROM Members INNER JOIN
(Meetings LEFT JOIN
(ActionItems INNER JOIN Category.Id = ActionItems.CategoryId)
ON Meeting.Id = ActionItems.MeetingId)
ON Members.Id = Meeting.MemberId;
谢谢!
答案 0 :(得分:2)
通常,在使用LEFT JOIN
时,需要对它们进行链接 - 也就是说,所有连接都应该是外连接。
试试这个:
SELECT mem.FirtName, mem.LastName, m.Notes, m.Location, ai.Details,
ai.CompleteByDate, c.Name
FROM ((Meetings as m LEFT JOIN
ActionItems as ai
ON m.Id = ai.MeetingId Members
) LEFT JOIN
Category as c
ON c.Id = ai.CategoryId
) LEFT JOIN
Members mem
ON mem.Id = m.MemberId;
也就是说,如果会议有多个行动项目,那么每个行动项目的每个成员都会重复。
答案 1 :(得分:1)
同一“分支”上的所有连接必须保留到链的末尾。所以在这种情况下,所有加入ActionItems的东西都需要保持连接。 你的选择应该是这样的:
SELECT Members.FirtName
, Members.LastName
, Meeting.Notes
, Meeting.Location
, ActionItems.Details
, ActionItems.CompleteByDate
, Category.Name
FROM Members INNER JOIN
(Meetings LEFT JOIN
(ActionItems LEFT JOIN Category.Id = ActionItems.CategoryId)
ON Meeting.Id = ActionItems.MeetingId)
ON Members.Id = Meeting.MemberId;