Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как удалить повторы по одному столбцу  [new]
mymzheka
Member

Откуда: Комсомольск-на-Амуре
Сообщений: 5
в MS SQL 2008r2 нужно удалить повторы из следующей таблицы:

CREATE TABLE [dbo].[DOC](
[DOC_ID] [int] NOT NULL,
[RECTYPE] [char](1) NULL,
[BIBLEVEL] [char](1) NULL,
[ITEM] [text] NULL,
...)


Повторы только в столбце ITEM, выбрать нужно так чтобы можно было все удалить строки с дублями...
Сделал пару вариантов запросов, которые, как мне кажется, должны работать (опыта работы с sql нема), но они не делают того что мне нужно, а точнее просто возвращают 0:

Здесь, как я понимаю, в подзапросе выбираются строки по сабстрингу поля ITEM без повторов, а внешний запрос выбирает всё и должен выдать всё то, чего нет в подзапросе (т.е. я должен получить дубли):

SELECT DOC_ID, substring([ITEM],0,1024)
FROM [SBO_m].[dbo].[DOC]
WHERE substring([ITEM],0,1024) not in(
   SELECT DISTINCT substring([ITEM],0,1024)
   FROM [SBO_m].[dbo].[DOC]
)


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

SELECT substring([ITEM],0,1024)
FROM [SBO_m].[dbo].[DOC]
except
SELECT DISTINCT substring([ITEM],0,1024)
FROM [SBO_m].[dbo].[DOC]


Что со мной не так? ЧЯНТД?
24 дек 11, 08:40    [11818969]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить повторы по одному столбцу  [new]
mymzheka
Member

Откуда: Комсомольск-на-Амуре
Сообщений: 5
P.S. БД библиотечной MARC-SQL, из неё самой почистить дубли не представляется возможным
24 дек 11, 08:43    [11818971]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить повторы по одному столбцу  [new]
qwerty112
Guest
mymzheka,

для начала,очень как-то подозрительно то, что повторы ищатся по полю с типом [text] ...
тип устаревший - во 1-ых
а, главное, раз возникла необходимость "вылавливать" дубли по такому поля, то "что-то в консерватории не так .."

вообщем, если готовы ограничится первыми 1024-мя символами, то как-то так
SELECT *
FROM [SBO_m].[dbo].[DOC]
WHERE cast([ITEM] as varchar(1024)) in(
   SELECT cast([ITEM] as varchar(1024))
   FROM [SBO_m].[dbo].[DOC]
   group by cast([ITEM] as varchar(1024))
   having count(*) > 1
   
)


зы
обе фразы курсивом - бредятина
24 дек 11, 09:44    [11818981]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить повторы по одному столбцу  [new]
mymzheka
Member

Откуда: Комсомольск-на-Амуре
Сообщений: 5
qwerty112,

Спасибо,) как будет возможность попробовать - отпишусь.
24 дек 11, 09:57    [11818985]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить повторы по одному столбцу  [new]
mymzheka
Member

Откуда: Комсомольск-на-Амуре
Сообщений: 5
Нужен запрос который позволит удалить именно дубли, т.е. если одинаковых строк 8 - удалить 7. Этот запрос выводит все 8, как оставить одну?)
26 дек 11, 03:16    [11823691]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить повторы по одному столбцу  [new]
mymzheka
Member

Откуда: Комсомольск-на-Амуре
Сообщений: 5
Как я понял такое средствами sql не сделать. Проблема уже решена указанием определённого диапазона id.
26 дек 11, 05:42    [11823756]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить повторы по одному столбцу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
mymzheka
Как я понял такое средствами sql не сделать. Проблема уже решена указанием определённого диапазона id.
Странно читать такое...
WITH CTE(N) AS
(
 SELECT ROW_NUMBER()OVER(PARTITION BY CAST([ITEM]AS VARCHAR(MAX)) ORDER BY (SELECT 0))
 FROM [dbo].[DOC]
)
DELETE CTE
WHERE N>1;
26 дек 11, 09:13    [11824060]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить повторы по одному столбцу  [new]
mumzuka
Guest
mymzheka
Как я понял такое средствами sql не сделать. Проблема уже решена указанием определённого диапазона id.

для того чтобы сделать средствами sql, наверно нужно сформулировать sql-условие, по которому sql сможет отобрать из дубликатов те, которые нужно оставить и те, которые нужно удалить.
например,- "оставить из дубликатов экземпляр с наименьшим id".

с этого момента и в терминах t-sql все просто описывается
where exists (select ... where cast([ITEM] as varchar(1024)) = cast([ITEM] as varchar(1024)) and id > id)
26 дек 11, 09:15    [11824068]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить