SQL Удаляет дубликаты записей и оставляет остальное

#sql #sql-server

#sql #sql-server

Вопрос:

У меня есть 2 таблицы a и b. У A есть 5 записей, а у B есть те же записи, что и у A, но 7 строк. Это те же значения в 7 строках. Я хочу удалить только первые 5 записей в B, поскольку номер строки совпадает с A. Как это сделать. пожалуйста, помогите мне.

таблица: A

     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 строки в таблице b.

Комментарии:

1. что вы подразумеваете под записями и строками здесь? можете ли вы различать?

2. рассматривайте все записи как СТРОКИ.

3. можете ли вы опубликовать некоторые примеры данных и желаемый результат.. описание ОС неясно..

4. В таблице a 3 столбца col1, col2, col3. данные в каждой из строк следующим образом 1 2 Н; 1 н 2 ;1 2 Н ;1 н 2 ;2, 2 м ;2, 2 м; в таблице B, данные 1 2 Н ; 1 н 2 ; 1 2 Н ; 1 н 2 ; 1 2 Н ; 1 н 2 ; теперь мне нужны только последние 2 ряда должны присутствовать в таблице B. То есть первые 4 строки в таблице b сопоставляются с таблицей a.

5. @Robinclave, вместо того, чтобы давать ему комментарий, отредактируйте свой вопрос и опубликуйте данные таблицы.

Ответ №1:

Попробуйте это :

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

Ответ №2:

Я добавил столбец 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
 

Комментарии:

1. мы не можем добавить новый столбец в эту таблицу. Могу ли я использовать курсор для этого? есть идеи?

2. @Robinclave Я не могу рассказать о курсорах, так как у меня нет недавнего опыта их использования. Вот идея — создайте другую таблицу, скажем, C, со всеми столбцами из B и идентификатором столбца в качестве идентификатора первичного ключа. Вставьте все данные в таблицу C из B, выполните запрос из моего ответа с помощью C вместо B, удалите все записи из B и вставьте в B оставшиеся записи из C. На самом деле запросу нужен столбец ID только в таблице B, он не нужен в таблице A.

Ответ №3:

Вы можете использовать ключевое слово 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
 

или

Примечание: Ниже приведен пример удаления одной или нескольких записей на основе их идентификаторов

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