第一次正确记录后SQLite加入导致重复数据

时间:2017-04-04 19:43:25

标签: sqlite

我遇到的问题是,在Select语句中的第一条记录之后,某些列中的数据在Select语句中被复制。我将提供与我合作的声明:

SELECT Call.CallID AS [Call #],
   (Members.FirstName || ' ' || Members.LastName) AS OIC,
   Alarm.AlarmID,
   Alarm.AlarmDesc AS Alarm,
 --Group_Concat(m2.FirstName || ' ' || m2.LastName) AS [Line Officers],
   Group_Concat(m1.FirstName || ' ' || m1.LastName) AS Members
FROM Call
   LEFT JOIN
   Members ON Call.OIC = Members.MemberID
   LEFT JOIN
   Alarm ON Call.AlarmID = Alarm.AlarmID
   LEFT JOIN
   CallToMembers ON Call.CallID = CallToMembers.CallID
 --LEFT JOIN 
 --CallToLineOfficers on Call.CallID = CallToLineOfficers.CallID
   LEFT JOIN
   Members AS m1 ON CallToMembers.MemberID = m1.MemberID
 --LEFT JOIN
 --Members as m2 on CallToLineOfficers.MemberID = m2.MemberID
GROUP BY Call.CallID;

好的,所以这个语句会返回我需要的所有东西并且工作正常。但是,每当我取消注释被注释掉的行,以便我可以获得"线路官员"从Bridge Table" CallToLineOfficers",数据开始在列中复制,如下所示:

错误的完整选择声明 - 没有任何评论。 Incorrect Complete Select Statement 正确的线路人员 - 如果我为CallToMembers评论加入。 Correct Line Officers 正确的会员 - 如果我评论JoT for CallToLineOfficers。 Correct Members

正如你所看到的,一旦我介绍了两个"会员"和"线路官员",出了问题。

1 个答案:

答案 0 :(得分:1)

当你与线路官员一起加入电话时,你会得到一个中间结果:

Call #  Line Officers
------  -------------
54      Bob Clark
54      Rob Catalano

当您再加入成员时,数据库会再次匹配电话号码,因此对于中间结果中的每个行,您将获得与成员的所有组合:

Call #  Line Officers  Members
------  -------------  -----------
54      Bob Clark      Matt Butler
54      Rob Catalano   Matt Butler
54      Bob Clark      Tom Cramer
54      Rob Catalano   Tom Cramer
...

因此,如果您有多个具有1:N关系的独立表,则无法使用连接。

您实际上并不希望结果中有多个行官/成员行,因此您只需使用子查询来聚合这些值:

SELECT CallID,
       (SELECT group_concat(FirstName || ' ' || LastName)
        FROM CallToLineOfficers
        JOIN Members USING (MemberID)
        WHERE CallID = Call.CallID
       ) AS "Line Officers",
       (SELECT group_concat(FirstName || ' ' || LastName)
        FROM CallToMembers
        JOIN Members USING (MemberID)
        WHERE CallID = Call.CallID
       ) AS Members
FROM Call;