我遇到的问题是,在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",数据开始在列中复制,如下所示:
错误的完整选择声明
- 没有任何评论。
正确的线路人员
- 如果我为CallToMembers评论加入。
正确的会员
- 如果我评论JoT for CallToLineOfficers。
正如你所看到的,一旦我介绍了两个"会员"和"线路官员",出了问题。
答案 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;