【发布时间】:2019-09-23 05:01:43
【问题描述】:
我正在使用 SQLite。我有 2 张表,一张是活动中的工作人员列表,其中包含活动 ID 和活动详细信息。 另一个表包含工人缺勤的详细信息,以及他们打算参加的活动 ID。
我想返回一个工人的缺席历史记录(来自 Absent 表),并包含来自该事件中的任何工作人员的事件详细信息(来自表 Events)。
我正在返回我想要的内容,但是这些行与活动中的工作人员数量重复。因此,如果有 3 个工作人员的事件 100 中没有工作人员 John,则查询将返回:
John, Event 100, Event 100 Details
John, Event 100, Event 100 Details
John, Event 100, Event 100 Details
查询是:
SELECT mm.WorkerID, mm.EventID, ar.EventDetails FROM AbsentTable AS mm
LEFT JOIN EventsTable AS ar
ON mm.EventID = ar.EventID
WHERE mm.WorkerID = :WorkerID
我正在简化事情,因为我想弄清楚我的代码没有修复的原因。为什么查询返回倍数?我尝试了许多替代方法,包括选择行中的 distinct。
【问题讨论】:
-
因为您正在加入与缺席事件匹配的事件中的每一行。当您只希望返回一个值时,您必须以某种方式聚合。这通常通过 Grouping 或 Distinct 完成。
-
我花了一段时间才明白在仅仅加入活动时如何获得重复。您所说的 EventsTable 似乎不是事件表,而是事件中的工作人员表。不幸的是,甚至充满了冗余的事件数据。因此,与其尝试修复查询,不如修复数据模型。 (可能是一个事件表、一个工作表、一个workers_in_events 表,然后是后者中的缺失属性或用于缺失信息的单独表。)