2011-11-02 55 views
1

我有2個表a和b。 A有5條記錄,B有與A相同的記錄,但有7條記錄。這是7行中的相同值。我想刪除B中的前5個記錄,因爲行號與A相匹配。如何執行此操作。請幫幫我。SQL刪除重複的記錄,並留下其餘

表:一個

col1 col2 col3 DuplicateCount 
    1  2  n   1 
    1  2  n   2 
    1  2  n   3 
    1  2  n   4 
    2  2  m   1 
    2  2  m   2 

表B:

col1 col2 col3 DuplicateCount 
    1 2  n   1 
    1 2  n   2 
    1 2  n   3 
    1 2  n   4 
    1 2  n   5 
    1 2  n   6 

期望的數據應當駐留在表B是

col1 col2 col3 DuplicateCount 

    1 2 n  5  
    1 2 n  6 

這只不過是最後2個表中的行灣

+0

你是什麼在這裏記錄和行是什麼意思?你能區分嗎? –

+0

將所有記錄視爲ROWS。 –

+3

你可以發佈一些示例數據和所需的輸出..說明os不清楚.. – StevieG

回答

0

您可以使用TOP關鍵字刪除前五個記錄

DELETE TOP (select * from TableA a,TableB b where a.col1=b.col1 AND a.col2=b.col2 AND 
a.col3=b.col3) FROM TableA 

注:以下是基於它們的ID刪除一個或多個記錄的例子

DELETE From yourTable where ID in (2,3,4,5,6) 
+0

@Rincinclave,現在看到已編輯的文章。 –

1

試試這個:

delete from TableB 
WHERE Id IN 
(
    select b.id 
    from TableB b, TableA a 
    WHERE b.Id = a.ID 
) 
0

我添加ID列,以確定表B中的行,我不知道怎麼只有一些重複的行沒有ID列的刪除:

declare @a table 
(
    id int primary key, 
    col1 int, 
    col2 int, 
    col3 varchar 
) 

declare @b table 
(
    id int primary key, 
    col1 int, 
    col2 int, 
    col3 varchar 
) 

insert into @a values (1,1,2,'n') 
insert into @a values (2,1,2,'n') 
insert into @a values (3,1,2,'n') 
insert into @a values (4,1,2,'n') 
insert into @a values (5,2,2,'n') 
insert into @a values (6,2,2,'n') 


insert into @b values (10,1,2,'n') 
insert into @b values (20,1,2,'n') 
insert into @b values (30,1,2,'n') 
insert into @b values (40,1,2,'n') 
insert into @b values (50,1,2,'n') 
insert into @b values (60,1,2,'n') 


delete from @b 
where id in 
(
    (
     select t1.id from 
     (
      select 
       id, 
       cnt = count(*) over(partition by col1, col2, col3), 
       rn = row_number() over(partition by col1, col2, col3 order by id) 
      from @b 
     ) t1 
     join 
     (
      select 
       *, 
       cnt = count(*) over(partition by col1, col2, col3) 
      from @a 
     ) t2 on 
      t1.cnt > 1 and t1.rn <= t2.cnt 
    ) 
) 

select * from @b 
+0

我們無法將新列添加到該表中。我可以使用光標執行此操作嗎?任何想法? –

+0

@Rincinclave我無法講述遊標,因爲我最近沒有使用它們的經驗。這是一個想法 - 用C和列ID中的所有列作爲主鍵標識創建另一個表,比如C。將所有數據插入B的表C中,使用C而不是B從我的答案中執行查詢,從B中刪除所有記錄並從C中插入B剩餘的記錄。查詢實際上只需要在表B中的ID列,在表A中不需要它。 – Alexey