#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)