sql server在检查依赖表中是否存在这些记录后,从表中删除重复记录

时间:2014-06-27 22:48:50

标签: sql sql-server

我有两张表格如下

TABLE_1
APP_MED_CHIP_ID APPLICATION_ID PERSON_ID
248340 1228144 1028940
248342 1228144 1028940

328526 1273218 818905
328527 1273218 1386405
328528 1273218 1386407

TABLE_2
APP_MED_CHIP_DETAIL_ID APP_MED_CHIP_ID
92574 248342

在表1中,前2个记录是重复的,因为它们具有相同的application_id和person_id,因此我需要获取这2条记录中的APP_MED_CHIP_ID(248340,248342),检查表2中是否存在这些记录,然后从中删除记录表2中没有的表格。

我使用以下查询选择所有重复项。

SELECT * FROM <br>
(SELECT ROW_NUMBER() OVER (PARTITION BY APPLICATION_ID,PERSON_ID ORDER BY APPLICATION_ID,PERSON_ID) as ROW,* 
FROM Table_1) as p<br>
where p.APP_MED_CHIP_ID not in<br> 
(select APP_MED_CHIP_ID from Table_2)<br>
and p.ROW > 1

我的查询问题在于Table_1中的第一组记录,我的结果集不会显示第一组记录,因为我使用条件p.ROW&gt; 1,但如果我不使用这个条件,我将无法过滤重复项。

我只显示了两组记录作为示例,但我的table_1中还有许多其他记录。

请告知如何解决此问题。

谢谢。

1 个答案:

答案 0 :(得分:1)

  

从表1中删除表2中不存在的记录

所以,我认为你想删除&#34;重复&#34; Table_1中的行,表2中不存在。您只希望在按APPLICATION_ID和PERSON_ID分组时有超过记录时删除行。

你可能会这样做:

Delete From Table_1
Where APP_MED_CHIP_ID Not In
(
    Select APP_MED_CHIP_ID From Table_2
)
And Exists
(
    Select 1 From Table_1 As T1
    Where Table_1.APPLICATION_ID = T1.APPLICATION_ID
       And Table_1.PERSON_ID = T1.PERSON_ID
    Having Count(*) > 1
)

当然,根本问题是Table_1中允许脏数据。如果您对DDL有任何控制权,则可以在Table_1上设置约束,例如Table_1.APP_MED_CHIP_ID引用Table_2.APP_MED_CHIP_ID的FK或Table_1列上的唯一约束({ {1}},APPLICATION_ID)。如果你对DDL没有任何控制权,我觉得你。