SQL Query,无论子记录是否存在,都返回父记录

时间:2018-05-09 15:41:39

标签: sql ms-access access-vba

我需要帮助构建一个返回父记录的查询(来自Meeting表),无论子记录是否存在(来自ActionItems表)。我能够通过LEFT JOIN执行此操作,但是一旦我添加了其他关联表(成员和类别),代码将无法正常工作。

这是我的表的结构:

enter image description here

我需要显示每次会议的信息

  1. 在ActionItems表中,CategoryId字段可能为空白,即使CategoryId为空,我也需要显示ActioItem

  2. 会议可能没有与之关联的任何操作项,即使没有ActionItems也需要返回会议记录

  3. 这是我的代码不起作用(我可能需要进行多次查询,这很好):

    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;
    

    谢谢!

2 个答案:

答案 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;