删除联结表中多次出现的相同ID#和代码

时间:2012-04-02 19:47:59

标签: sql tsql

enter code here enter image description 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.

3 个答案:

答案 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_IDICD_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