SQLite联接在第一个正确记录后导致重复数据
我遇到一个问题,在Select语句中的第一条记录之后,某列中的数据在Select语句中被复制。我将提供与我合作的声明: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 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表中进行选择时,我都应该使用子查询对这样的列进行单独的选择,以避免获得重复的数据?这取决于您希望从中得到什么样的结果。