首页 > 解决方案 > 如何通过比较两个相同的表来删除行重复 SQL

问题描述

如何删除重复值 a = b 和 b = a?

with a as(select w.id , w.doc, w.org 
, d.name_s, d.name_f, d.name_p, d.spec      
, o.name, o.extid    
from crm_s_workplaces w    
join crm_s_docs d on d.id=w.doc    
join crm_s_orgs o on o.id=w.org    
where d.active=1 and d.cst='NY' and w.active=1 and w.cst='NY' and o.active=1 
and    
o.cst='NY')     
select a1.doc, a2.doc,    
a1.org,a1.name_s,a1.name_f,a1.name_p,a2.name_s,a2.name_f,a2.name_p from a a1    
join a a2 on     
a1.name_s=a2.name_s and    
substr(a1.name_f,1,1)=substr(a2.name_f,1,1) and    
substr(a1.name_p,1,1)=substr(a2.name_p,1,1) and     
a1.org=a2.org and    
a1.spec<>a2.spec    
order by a1.name_s    `enter code here`

ER模型图:

ermodel-图

重复示例:

重复示例

有时会遇到a1.spec > a2.spec

有时会遇到 a1.spec>a2.spec

标签: sqlduplicatescomparerow

解决方案


您所说的“重复项”实际上不是数据库中的重复项。

您基本上有多个文档记录,可能是同一个人,也可能不是同一个人。看到即使他们的名字也不总是匹配的。例如,

doc_id 1131385 有 NAME_F = "Gabr" 而 doc_id 1447530 有 NAME_F = "Gabor"

在您的数据库中,这是两个不同的实体,您无法使用主键匹配它们。您可以尝试加入名字、中间名和姓氏,但正如您在上面的 Gabor/Gabr 示例中看到的那样,即使这样也行不通。

您可以更改数据库的架构吗?如果是这样,您需要将文档分隔在一张表中 - 每位医生 1 条记录。并在具有以下列的单独表中进行专业化:

spec_id (int, PK) doc_id (Doc table 的外键) 特化

这样,如果你有 1 位医生有 3 个规格,他/她只会在 doc 表中出现一次,而在 spec 表中会出现多次。

我只是注意到别的东西。您在表格工作区中有规范字段。为什么?如果您的意思是说 Doc Gabor 在医院 1 中担任管理员,但在医院 2 中担任治疗师,您可以这样做。但是,您必须从文档表中删除规范字段,并且仅在工作场所表中使用规范。


推荐阅读