sql - 如何通过比较两个相同的表来删除行重复 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模型图:
重复示例:
有时会遇到a1.spec > a2.spec
:
解决方案
您所说的“重复项”实际上不是数据库中的重复项。
您基本上有多个文档记录,可能是同一个人,也可能不是同一个人。看到即使他们的名字也不总是匹配的。例如,
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 中担任治疗师,您可以这样做。但是,您必须从文档表中删除规范字段,并且仅在工作场所表中使用规范。
推荐阅读
- python - 第一篇关于 instagram 配置文件的 xpath 不起作用(python、selenium、chromedriver)
- julia - CartesianIndex 操作
- python - 在日期时间重新采样并计算平均值
- scala - 使用 Spark/scala 将字符串转换为 DataFrame
- c - 在C中打印数组的总和
- rust - 如何创建 Vec
在哪里 T: Into<_> 在 Rust 中? - python - 用 pyautogui 写小写字母和字符
- apache-kafka - Kafka Producer 将生产者消息限制为 1024 字节
- python - SQLAlchemy 如何在烧瓶中查询登录用户的数据库?
- android - Firebase getValue() 方法在应用小部件中不起作用