Удалить строки без начальных нулей - PullRequest
3 голосов
/ 17 сентября 2011

У меня есть таблица с колонкой (registration_no varchar (9)). Вот образец:

id  registration no
1   42400065
2   483877668
3   019000702
4   837478848
5   464657588
6   19000702
7   042400065

Обратите внимание на регистрационные номера, такие как (042400065) и (42400065), они почти одинаковы, разница только в ведущем нуле.

Я хочу выбрать все регистрационные номера, которые имеют тот же регистр, что и выше, и удалить номера без начального нуля, т.е. (42400065)

Пожалуйста, обратите внимание, что перед тем, как удалить без начальных нулей (42400065), я должен быть уверен, что есть эквивалент с ведущими нулями (042400065)

Ответы [ 4 ]

2 голосов
/ 17 сентября 2011
declare @T table
(
  id int,
  [registration no] varchar(9)
)

insert into @T values
(1,   '42400065'),
(2,   '483877668'),
(3,   '019000702'),
(4,   '837478848'),
(5,   '464657588'),
(6,   '19000702'),
(7,   '042400065')

;with C as
(
  select row_number() over(partition by cast([registration no] as int) 
                           order by [registration no]) as rn
  from @T
)
delete from C
where rn > 1
0 голосов
/ 17 сентября 2011

Я думаю, что вы можете сделать это с помощью одного оператора DELETE. JOIN гарантирует, что только дубликаты могут быть удалены, и ограничение ограничивает его дополнительными регистрационными номерами, которые не начинаются с «0».

DELETE 
    r1
FROM
    Registration r1
JOIN
    Registration r2 ON RIGHT(r1.RegistrationNumber, 8) = r2.RegistrationNumber
WHERE
    LEFT(r1.RegistrationNumber, 1) <> '0'

Ваша таблица выглядит так после выполнения вышеупомянутого УДАЛЕНИЯ. Я протестировал его на экземпляре SQL Server 2008.

ID          RegistrationNumber
----------- ------------------
2           483877668
3           019000702
4           837478848
5           464657588
7           042400065
0 голосов
/ 17 сентября 2011

Это решение не будет зависеть от регистрационных номеров, имеющих конкретную длину, оно просто ищет те, которые имеют одинаковое целое число, но не одно и то же значение (из-за начальных нулей), и выбирает для записи, которая имеет«0» в качестве первого символа.

DELETE r
FROM Registration AS r
JOIN Registration AS r1 ON r.RegistrationNo = CAST(r1.RegistrationNo AS INT)
    AND r.RegistrationNo <> r1.RegistrationNo
WHERE CHARINDEX('0',r.registrationno) = 1
0 голосов
/ 17 сентября 2011
create table temp id int;
insert into temp select id from your_table a where left (registration_no, ) = '0' and 
   exists select id from your_table 
              where a.registration_no = concat ('0', registration_no)

delete from your_table where id in (select id from temp);

drop table temp;
...