【问题标题】:SQL Join returns duplicated query resultSQL Join 返回重复的查询结果
【发布时间】: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 表,然后是后者中的缺失属性或用于缺失信息的单独表。)

标签: sql sqlite


【解决方案1】:

我有 2 张表,其中一张是活动中的工作人员列表,包含活动 ID 和活动详细信息

问题在于EventsTable 包含每个事件的多条记录。您的加入会返回与活动中的工作人员一样多的记录。

一种解决方案是使用子查询从EventsTable 中选择您感兴趣的DISTINCT 值,然后将其与AbsentTable 连接起来。

SELECT mm.WorkerID, mm.EventID, ar.EventDetails 
FROM AbsentTable AS mm  
LEFT JOIN (SELECT DISTINCT EventID, EventDetails FROM EventsTable) AS ar 
    ON mm.EventID = ar.EventID 
WHERE mm.WorkerID = :WorkerID

底线:你有一个设计问题。在EventsTable 中的多条记录上重复相同的信息(事件详细信息、事件ID)。最好有一个单独的表来存储事件(每个事件一条记录),然后在跟踪每个工作人员在每个事件中的存在的表中引用该表的主键。

【讨论】:

  • 我明白你说的重新设计问题,谢谢你的解释。
猜你喜欢
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2015-02-24
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多