如何在两个表之间找到缺失的代码?

Posted

技术标签:

【中文标题】如何在两个表之间找到缺失的代码?【英文标题】:How do I find the missing codes between two tables? 【发布时间】:2020-05-14 19:38:32 【问题描述】:

我有两张桌子:

表一包含 3 列:

spellNUM(住院住院的唯一标识符), nhsNUM(患者的唯一标识符),以及 2020 年 4 月(即一个月)的诊断(用于住院期间记录的诊断代码)。

第二个表格包含所有时间(大约 10 年以上)的医院拼写编号、nhs 编号和诊断。

我的目标是针对表 1 中的每个 spellNUM,从表 2 中确定每个患者缺少哪些诊断代码 (NhsNUM)(即不存在于表 1 中列出的咒语中)。

例如, 表一:

spellNUM/nhsNUM/diagnosisCD
1   /  443  / g111
1    /   443     / y555
1     /   443     / t777
2       / 443    /   a555
2       /  443   /    u777

表二:

spellNUM/nhsNUM/diagnosisCD
1      /  443   /   g111
1   /     443   /   y555
1    /    443   /   t777
2    /    443   /   a555
2      /   443   /   u777
3   /     443   /   k656
3     /   443    /  u777
3       / 443  /  g111
3      /  443  /  y555

对于拼写 1,在表一中,缺少的代码是 a555、u777 和 k656(表 2 中拼写 2 和 3 的缺失代码)。请注意,咒语 3(表 2)中的某些代码与咒语 1(表 1)中的代码相同(例如 g111),因此我们对它们不感兴趣。

对于表一中的法术 2,缺少的代码是 g111、y555、t777、k656(来自表二中的法术 1 和 3)。

我需要我的输出列出 spellNUM、nhsNUM 和不同的缺失诊断代码。

在这种情况下,它将是:

spellNUM/nhsNUM/diagnosisCD
1    /  443   /a555
1   /  443  /  u777
1  /   443   / k656
2   /  443   / g111
2   /  443  /  y555
2   /  443 /  t777
2   / 443  / k656

我尝试了一大堆 ctes 和窗口函数,但我的努力都是徒劳的!

【问题讨论】:

您使用的是哪个 dbms? 对我来说,spellNum 何时重要以及何时不重要的逻辑尚不清楚。我不知道分组规则是什么。 【参考方案1】:

你可以这样做:

with 
t1 as (select distinct spellNum, nhsNum from table1),
t2 as (select distinct nhsNum, diagnosisCd from table2),
x as (select t1.*, t2.diagnosisCD from t1 cross join t2) 
select * from x
where not exists (select * from table1 y 
where x.spellNum = y.spellNum and 
  x.nhsNum = y.nhsNum and x.diagnosisCD = y.diagnosisCD);

DBFiddle demo

【讨论】:

谢谢!我以前从未使用过交叉连接,但会有一个谷歌! 交叉连接的潜在问题是我们的表有数千行(我只举了几个例子),所以如果我正确理解交叉连接,我们最终会生成数百万行桌子?我明天试试,让你知道它是如何运行的!有没有使用交叉连接的替代方法? 不完全是。您正在将不同的 spellNumber、nhsNumber(X 行)与不同的 nhsNumber、diagnosisCodes(Y 行)交叉连接。尽管有接近 7 万个 ICD 10 代码,但对于特定患者,您的代码平均不应超过 5 个(诊断不应非常松散)。我不知道 spellNumber 是什么,如果每个患者平均可以是 10 并且您有 100 000 名患者,结果只有 500 万行。这听起来是一次性的工作,不需要寻找另一种方式。如果您需要,您仍然可以通过其他方式进行操作,可能使用外部应用或不存在查询。【参考方案2】:

您的问题称为合并问题。经常退出不同版本的文件需要compared/merged才能发现它们的差异。您的问题非常相似,只是您需要比较/合并数据库表以查看它们的差异。

一些数据库系统支持merging directly in SQL - 如果您想根据另一个表的内容更新一个表,请研究您系统的 SQL 参考。

这是我使用搜索查询“合并数据库类型”找到的开源工具之一,以防您不想使用工具解决此问题: https://www.codeproject.com/Articles/1185498/Comparator-data-sources-comparer

...如果您需要 SQL 代码中的编程解决方案,这里是一个 SO solution in T-SQL。

Here is the solution,我从上面链接下的代码改编而来:

create table table1 (spellNum int, nhsNum int, diagnosisCD varchar(10));
create table table2 (spellNum int, nhsNum int, diagnosisCD varchar(10));

insert into table1 (spellNUM, nhsNUM, diagnosisCD) values
(1, 443, 'g111'),
(1, 443, 'y555'),
(1, 443, 't777'),
(2, 443, 'a555'),
(2, 443, 'u777');

insert into table2 (spellNUM, nhsNUM, diagnosisCD) values
(1, 443, 'g111'),
(1, 443, 'y555'),
(1, 443, 't777'),
(2, 443, 'a555'),
(2, 443, 'u777'),
(3, 443, 'k256'),
(3, 443, 'u777'),
(3, 443, 'g111'),
(3, 443, 'y555');

-- will list all rows in table1 that are not present in table2
SELECT *
 from table1
except select *
 from table2

-- will show all in table2 that are not in table1 
SELECT *
 from table2
except select *
 from table1

-- will show all rows that are identical in both tables.
-- If any colums are known to vary between tables, specify only those columns
-- you need to compare.
SELECT *
 from table1
intersect select *
 from table2

输出是:

spellNum    nhsNum  diagnosisCD

spellNum    nhsNum  diagnosisCD
3           443     g111
3           443     k256
3           443     u777
3           443     y555

spellNum     nhsNum  diagnosisCD
1            443     g111
1            443     t777
1            443     y555
2            443     a555
2            443     u777

【讨论】:

Note that some codes in spell 3 (table 2) are the same as those in spell 1 (table 1)(e.g. g111) and so we are not interested in them. 这不是MERGE,甚至不是增量列表。 声明:'我需要我的输出来列出 spellNUM、nhsNUM 和不同的缺失诊断代码。'向我建议我们正在寻找一个差异,这是我在 T-SQL 的最后一个链接中链接的内容。 查看想要的结果。在简单的MERGE 中出现的所有spellNUM = 3 结果在哪里? 我的意思是,你可能是对的,但我确实希望 OP 能提供一些澄清。 大家好,感谢您的回复。当查看给定的拼写颗粒(拼写编号)时,我们正在寻找每个患者(nhs 编号)缺失的不同代码(诊断 CD)之间的差异。例如,如果查看咒语 1,我们感兴趣的是其他咒语(2 和 3)中存在哪些代码,而咒语 1 中不存在这些代码。在上面的示例中,咒语 1 和 2 在 4 月(样本月份) , 咒语 3 来自那个时期之外。

以上是关于如何在两个表之间找到缺失的代码?的主要内容,如果未能解决你的问题,请参考以下文章

理货表在两个日期之间插入缺失的日期? SQL

如何在数组中找到两个缺失值? [复制]

MySQL:查找日期范围之间的缺失日期

在 SQL 中查找表之间缺失的数字

如何使用 Access VBA 删除表之间的匹配行/记录?

如何首先在两个表 asp.core 代码之间建立关系