Можно ли удалить повторяющиеся строки из таблицы, не зная ее столбцов? - PullRequest
0 голосов
/ 26 мая 2019

Есть ли способ удалить все дублирующиеся строки из произвольной таблицы в базе данных, когда вы не знаете структуру таблицы (ее столбцы), используя только простой SQL (без использования PL / SQL)?

-- The code should look something like this
DELETE FROM tableName -- tableName can be changed
WHERE ...

Так, например, для следующей таблицы:

.-------.
| A | B |
|---|---|
| 1 | 1 | -- (1)
| 2 | 1 | -- (2)
| 2 | 1 | -- (3) duplicate of (2)
| 3 | 2 | -- (4)
| 3 | 2 | -- (5) duplicate of (4)
| 3 | 2 | -- (6) duplicate of (4)
'-------'

результат должен быть следующим:

.-------.
| A | B |
|---|---|
| 1 | 1 | -- (1)
| 2 | 1 | -- (2)
| 3 | 2 | -- (4)
'-------'

1 Ответ

1 голос
/ 26 мая 2019
SELECT distinct * from TableA INTO TableB; 
truncate TableA;
insert into TableA select * from tableB;
drop tableB;

Дополнительные ответы из комментариев:

Создайте CTE (создайте это динамически, используя параметризованный SQL и информационную схему)

;WITH cteExample (val1, val2, RN) as 
( select *, ROW_NUMBER() over (PARTITION by val1, val2 order by val1, val2) as RN from tableA) 
-- select * from cteExample -- to verify results
delete from cteExample where RN > 1 -- to delete duplicate records

Используйте отлично, если вы знаете, что таблицы будут иметьпервичный ключ (как они должны)

;WITH cteExample as (select distinct * from TableA) delete a from cteExample b right join TableA a on b.primaryKey = a.PrimaryKey where b.PrimaryKey is null;

Наконец, полностью пропустите CTE, если хотите:

delete a from TableA a left join (select distinct * from TableA) b on a.PK = b.PK 
where b.PK is null

Все эти операторы лучше всего обслуживать динамически с использованием хранимой процедурыили эквивалент exec sp_executeSQL (если есть), чтобы получить имена столбцов без предварительного знания столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...