我有两个表:
表一包含三列:
第二张表包含医院拼写号码,国家卫生服务局(NHS)号码以及所有时间(大约10年以上)的诊断信息。
我的目标是针对表1中的每个咒语NUM,以识别表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中的拼写1,缺少的代码为a555,u777和k656(缺少表2中拼写2和3的代码)。请注意,法术3(表2)中的某些代码与法术1(表1)中的某些代码相同(例如g111),因此我们对它们不感兴趣。
对于表1中的法术2,缺少的代码为g111,y555,t777,k656(来自表2中的法术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和window函数,但是我的努力是徒劳的!
答案 0 :(得分:0)
您的问题被称为合并问题。通常,需要退出不同版本的文件,compared/merged才能发现它们之间的差异。您的问题非常相似,除了您需要比较/合并数据库表以查看它们之间的差异。
某些数据库系统支持merging directly in SQL-如果要基于另一个表的内容更新一个表,请研究系统的SQL参考。
如果您不想使用以下工具解决此问题,这是我使用搜索查询“合并数据库tybles”找到的一种开源工具: 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
答案 1 :(得分:0)
您可以这样做:
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);