SQLite联接在第一个正确记录后导致重复数据

SQLite联接在第一个正确记录后导致重复数据,sqlite,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) A

我遇到一个问题,在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;
好的,这个语句返回我所需要的一切,并且工作得很好。但是,每当我取消注释注释掉的行,以便从桥接表“CallToLineOffices”中获取“Line Offices”时,数据开始从列中复制,如下所示:

不正确的完整Select语句 -没有任何评论。 正确的一线官员 -如果我为CallToMembers注释连接。 正确的成员 -如果我为CallToLine官员评论加入。


正如您所看到的,一旦我介绍了“成员”和“一线主管”,事情就出了问题。

当您与一线主管进行通话时,您会得到如下中间结果:

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;

哇,太棒了!所以我提出了一个问题。每当我需要从一个可能的1:N表中进行选择时,我都应该使用子查询对这样的列进行单独的选择,以避免获得重复的数据?这取决于您希望从中得到什么样的结果。