【问题标题】:sqlite query over two tables related by many-to-many table, with duplicates on one tablesqlite查询多对多表相关的两张表,一张表有重复
【发布时间】:2011-10-23 11:42:35
【问题描述】:

我有 2 张桌子:

Attendee(AttendeeId integer PRIMARY KEY, LastName, FirstName, etc...)
Company(CompanyId integer PRIMARY KEY, CompanyName, etc ...)

以及它们之上的多对多关系:

CompanyAttendeeRelation
(
    CompanyId integer REFERENCES Company (CompanyId),
    AttendeeId integer REFERENCES Attendee (AttendeeId),
    PRIMARY KEY (CompanyId, AttendeeId)
);

因此,根据上述情况,一家公司可以有多个与会者,并且一名与会者可以在多个公司中。

但是,我已经尝试过,例如:

SELECT   (LastName || " " || FirstName) as AttendeeName,  
         CompanyAttendeeRelation.AttendeeId, 
         CompanyAttendeeRelation.CompanyId 

FROM     Attendee join CompanyAttendeeRelation on CompanyAttendeeRelation.AttendeeId = Attendee.AttendeeId join Company on CompanyAttendeeRelation.CompanyId = Company.CompanyId 

GROUP BY LastName;

但我没有让所有公司都参加。也就是说,例如,假设有AttendeeId = 15 的与会者有一个有CompanyId = 20 的公司和另一个有CompanyId = 100 的公司,我希望得到:

Doe John|15|20

Doe John|15|100

但我只得到:

Doe John|15|100

所以我不确定是否是 JOIN 在第一场比赛中停止,而第二场比赛永远不会被计算,或者是否某个地方重复(在本例中为 AttendeeId)被忽略。

有什么想法吗?

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    如果你想要所有的组合,你为什么要GROUP BY?不试一试。

    SELECT (LastName || " " || FirstName) as AttendeeName,  
           CompanyAttendeeRelation.AttendeeId, 
           CompanyAttendeeRelation.CompanyId 
    
    FROM   Attendee
    JOIN   CompanyAttendeeRelation ON CompanyAttendeeRelation.AttendeeId = Attendee.AttendeeId
    JOIN   Company on CompanyAttendeeRelation.CompanyId = Company.CompanyId; 
    -- GROUP  BY LastName;
    

    更好的是,对于这个特定的查询,您根本不需要加入 Company。所以试试这个:

    SELECT (LastName || " " || FirstName) as AttendeeName,  
           CompanyAttendeeRelation.AttendeeId, 
           CompanyAttendeeRelation.CompanyId 
    
    FROM   Attendee
    JOIN   CompanyAttendeeRelation ON CompanyAttendeeRelation.AttendeeId = Attendee.AttendeeId;
    

    【讨论】:

    • 我的意思是“订购”……太好了。呵呵。
    • 现在,在相关说明中,我将如何将 CompanyId 合并到结果表中的单个列中?也就是说,使用 ORDER BY(而不是 GROUP by)我得到了我给出的示例:Doe John|15|20。我实际上最终会使用 CompanyName,但你明白了。约翰|15|100。现在假设我想结束 Doe John|15|100 20|
    • @SaldaVonSchwartz:很酷,这个解决了。对于您的新问题,最好编辑您的问题或创建一个新问题以提高可读性。您可以随时链接到此链接以使事情变得清晰并节省自己的多余输入。
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    相关资源
    最近更新 更多