как удалить несколько записей для одного и того же почтового индекса, сохраняя хотя бы одну запись для этого почтового индекса в таблице базы данных - PullRequest
1 голос
/ 29 ноября 2010

как удалить несколько записей для одного и того же почтового индекса, сохраняя хотя бы одну запись для этого почтового индекса в таблице базы данных


id zipcode
1  38000 
2  38000 
3  38000 
4  38005
5  38005

я хочу таблицу с двумя столбцами с идентификатором и почтовым индексом ... мой финал будет следующим


id zipcode
1  38000 
4  38005

Ответы [ 6 ]

6 голосов
/ 29 ноября 2010

Как насчет

delete from myTable
where id not in (
    select Min( id )
    from myTable
    group by zipcode )

Это позволяет вам сохранять самые низкие идентификаторы, чего вы и хотели.

1 голос
/ 29 ноября 2010
with cte as (
 select row_number() over (partitioned by zipcode order by id desc) as rn
 from table)
delete from cte
where rn > 1;

Это имеет преимущество правильной обработки дубликатов и предлагает жесткий контроль над тем, что удаляется и что сохраняется.

1 голос
/ 29 ноября 2010

Чтобы просто выбрать этот набор результатов, вы должны использовать оператор DISTINCT:

SELECT id, zipcode
FROM table
WHERE zipcode IN (SELECT DISTINCT zipcode FROM table)

Чтобы удалить другие записи и сохранить только одну, вы используете подзапрос, например:

DELETE FROM table
WHERE id NOT IN 
(SELECT id
FROM table
WHERE zipcode IN (SELECT DISTINCT zipcode FROM table)
)

Вы можететакже выполните это, используя соединение, если вы предпочитаете.

0 голосов
/ 29 ноября 2010

Есть более простой способ, если вам нужен самый низкий идентификационный номер.Я только что проверил это:

SELECT 
    min(ID),
    zipcode
FROM #zip
GROUP BY zipcode
0 голосов
/ 29 ноября 2010

удалить из таблицы, в которой идентификатор не указан (выбрать min (id) из почтового индекса таблицы (выбрать отдельный почтовый индекс из таблицы));

выбрать отдельный почтовый индекс из таблицы - дастотдельный почтовый индекс в таблице выберите min (id) из таблицы, в которой почтовый индекс (выберите отдельный почтовый индекс из таблицы) - выдаст запись с минимальным идентификатором для каждого почтового индекса, удаляется из таблицы, где идентификатор отсутствует (выберите min (id) из почтового индекса таблицыв (выберите отдельный почтовый индекс из таблицы)) - это приведет к удалению всех записей в таблице, которых нет в результате запроса 2

0 голосов
/ 29 ноября 2010

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

select min(id), zipcode
into tmp_sometable
from sometable
group by zipcode

Удалить исходную таблицу:

drop table sometable

Переименовать временную таблицу:

sp_rename 'tmp_sometable', 'sometable'; 

или что-то вроде:

delete from sometable
where id not in
 (
   select min(id)
   from sometable
   group by zipcode
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...