Удалить строки результатов из таблицы в SQL - PullRequest
1 голос
/ 09 мая 2019

У меня есть 2 таблицы с именем BM_Data1 & BM_Data1_May62019.Обе таблицы содержат одинаковые данные, поскольку BM_Data1_May62019 является копией таблицы BM_Data1.Но BM_Data1 имеет несколько дополнительных строк. Как я могу удалить эти дополнительные строки из BM_Data1 и сделать их такими же, как BM_Data1_May62019.

Я получил дополнительные строки, используя следующий запрос.

SELECT * FROM
(SELECT * FROM BM_DATA1
EXCEPT
SELECT * FROM BM_DATA1_MAY62019) a

Есть 7803 дополнительные строки, как я могу удалить их из BM_Data1 таблицы?

Спасибо

Ответы [ 5 ]

1 голос
/ 09 мая 2019

Поскольку вы подтвердили, что RECID является общим в обеих таблицах с уникальным значением, вы можете попробовать следующий скрипт

DELETE FROM BM_DATA1
WHERE RECID NOT IN
(
    SELECT RECID FROM BM_DATA1_MAY62019
)
0 голосов
/ 09 мая 2019
create table t1(id int, demo int);
create table t2(id int, demo int);

insert into t1 values (1, 1);
insert into t2 values (1, 1);

insert into t1 values (2, 2);
insert into t2 values (2, 2);

insert into t1 values (3, 3);
insert into t2 values (3, 3);

insert into t1 values (4, 4); -- t1 table has some extra rows
insert into t1 values (5, 5); -- t1 table has some extra rows
insert into t1 values (6, 6); -- t1 table has some extra rows

Чтобы удалить те записи из первой таблицы, которые не являются второй таблицей:

delete from t1 where id not in (select id from t2) 
0 голосов
/ 09 мая 2019

Я включил немного DDL, чтобы вы могли запустить его для себя, чтобы помочь вам понять пример.Столбец ID является общим для обеих таблиц, и вы удаляете строки в A, которых нет в B

create table #data_a( id int, val int)
create table #data_b( id int, val int)

insert into #data_a select 1, 1 
insert into #data_a select 2, 4 
insert into #data_a select 3, 5 
insert into #data_a select 4, 5 
insert into #data_a select 5, 5 
insert into #data_a select 6, 5 
insert into #data_a select 7, 5 
insert into #data_a select 8, 5 

insert into #data_b select 1, 1 
insert into #data_b select 2, 4 
insert into #data_b select 3, 5 
insert into #data_b select 4, 5 
insert into #data_b select 5, 5 

-- delete the extra rows in A 
delete a from #data_a as a
left join #data_b as b on a.id = b.id
where b.id is null

-- we can see the rows are no longer in B
select * from #data_a
select * from #data_b

drop table #data_a
drop table #data_b
0 голосов
/ 09 мая 2019

Используйте оператор MERGE с WHEN NOT MATCHED BY SOURCE THEN DELETE.

MERGE работает как JOIN сортов, и вы должны быть в состоянии определить, какие строки равны.Вы делаете это с помощью условия ON - для вас это будет RECID.

. Я предлагаю сначала выполнить их в транзакции, чтобы убедиться, что вы удаляете только те данные, которые вы намереваетесь - исовершайте транзакцию только тогда, когда вы уверены, что у вас правильная конфигурация.Если что-то не так, вы можете откатить

BEGIN TRANSACTION

MERGE BM_DATA1 AS Target
USING BM_DATA1_MAY62019as Source 
   ON (Target.RECID = Source.RECID)
WHEN NOT MATCHED BY SOURCE
   THEN DELETE;

SELECT * FROM BM_DATA1

-- ROLLBACK TRANSACTION -- Uncomment and use this if it deleted the wrong data
-- COMMIT -- Uncomment and use this if it deleted the right data!
0 голосов
/ 09 мая 2019

использовать просто удалить с коррелированным подзапросом

   delete from [BM_DATA1] 
   where not exists 
     (select 1 
    from [BM_DATA1_MAY62019]
    where [BM_DATA1_MAY62019].RECID = [BM_DATA1].RECID -- put here here identified column name
     )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...