enter code here
我的问题是:在这个数据库中,联结表包含一些行,其中kha_id和icd_fk是相同的。虽然kha_id不止一次出现在icd_junction中,但它必须是单独的icd_fk。我可以运行一个查询并获取所有ID#和多次列出的代码,但有没有一种行业标准的方法可以删除除了每一个以外的所有内容?
例子:我所拥有的是
KHA_ID: 123456 V23
123456 V23
123456 V24
I need one of the rows kha_id=123456 and ICD_FK=V23 taken out.
答案 0 :(得分:3)
此:
DELETE j1
FROM ICD_Junction AS j1
WHERE EXISTS
( SELECT 1
FROM ICD_Junction AS j2
WHERE j2.KHA_ID = j1.KHA_ID
AND j2.ICD_FK = j1.ICD_FK
AND j2.ID < j1.ID
)
;
将为每个KHA_ID
和ICD_FK
删除ICD_Junction
以外的所有相关行。 (具体来说,它将保留最少ID
的那个,并删除其余的。)
运行上述操作后,您应该修复导致重复的代码,并添加unique constraint以防止再次发生这种情况。
(免责声明:未经测试,自从我上次使用SQL Server以来已经有一段时间了。)
编辑添加:如果我正确理解您的评论,您还需要查询帮助以查找重复项吗?为此,你可以写:
SELECT KHA_ID,
ICD_FK,
COUNT(1) -- the number of duplicates
FROM ICD_Junction
GROUP
BY KHA_ID,
ICD_FK
HAVING COUNT(1) > 1
;
答案 1 :(得分:2)
原始问题是删除,但评论已找到
Select jDup.*
FROM ICD_Junction AS j
JOIN ICD_Junction AS jDup
On j.KHA_ID = jDup.KHA_ID
AND j.ICD_FK = jDup.ICD_FK
AND j.ID < jDup.ID
Select max(jDup.ID), min(jDup.ID), count(*), jDup.KHA_ID, jDup.ICD_FK
FROM ICD_Junction AS jDup
Group By jDup.KHA_ID, jDup.ICD_FK
Having Count(*) > 1
答案 2 :(得分:0)
你想要一些使用ROW_NUMBER()和分区的东西。原因是它会让你选择一行来保留一个没有唯一id的表。就像这是一个没有身份的纯交集表一样,您可以使用此变体来删除RowID> gt的所有行。 1,只留下你独特的行。当你拥有一个唯一的id时,它也可以正常工作,你可以选择保留最早的id。
select * from (select KHA_ID, ICD_FK, ROW_NUMBER()
OVER(PARTITION BY KHA_ID, ICD_FK
ORDER BY ID ASC) AS RowID
from ICD_Junction ) ordered where RowID > 1