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

Откуда:
Сообщений: 4
Доброго времени суток! Необходимо написать запрос на удаление дубликатов.
Есть таблица

A_ID, O_ID
3 1
2 2
1 3

Необходимо получить таблицу
A_ID, O_ID
3 1
2 2
21 июн 11, 12:59    [10846048]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
Edkonst2008
Member

Откуда:
Сообщений: 503
Dimitriy_89
Доброго времени суток! Необходимо написать запрос на удаление дубликатов.
Есть таблица

A_ID, O_ID
3 1
2 2
1 3

Необходимо получить таблицу
A_ID, O_ID
3 1
2 2


Ну где тут были дубликаты?
21 июн 11, 13:10    [10846122]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
Dimitriy_89
Member

Откуда:
Сообщений: 4
Edkonst2008,

Проблема в том что столбцы A_ID, O_ID хранят связи для двух таблиц и их значения должны быть уникальны т.е.

1 3
и
3 1
приравнивается к повтору
21 июн 11, 13:16    [10846193]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Dimitriy_89,
CREATE table #t (id1 int,id2 int)
INSERT #t SELECT 1,3 union all SELECT 2,2 union all SELECT 3,1

select distinct 
case when id1>id2 THEN id2 ELSE id1 end,
case when id1>id2 THEN id1 ELSE id2 end
from #t
21 июн 11, 13:42    [10846547]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
WITH CTE(N) AS
(
 SELECT ROW_NUMBER() OVER
  (
   PARTITION BY
    CASE WHEN A_ID>=O_ID THEN A_ID ELSE O_ID END,
    CASE WHEN A_ID< O_ID THEN A_ID ELSE O_ID END
   ORDER BY O_ID
  )
 FROM [таблица]
)
DELETE CTE
WHERE N>1;
НЕ ПРОВЕРЯЛ!
21 июн 11, 13:44    [10846565]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
Dimitriy_89
Member

Откуда:
Сообщений: 4
iap,

Спасибо алгоритм хороший но проблема в том что 1 3 я написал для простаты описания проблеммы
в столбцах хранится данные Varchar

пример выборки

A_ID, O_ID
1d4cb376:11e21494753:-2449 1d4cb376:11e21494753:-7468
1d4cb376:11e21494753:-7468 1d4cb376:11e21494753:-2449

поэтому вариант с

case when id1>id2 THEN id2 ELSE id1 end,
case when id1>id2 THEN id1 ELSE id2 end

не подойдет
21 июн 11, 13:55    [10846680]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
bacalavr
Member

Откуда:
Сообщений: 311
Dimitriy_89
Спасибо алгоритм хороший но проблема в том что 1 3 я написал для простаты описания проблеммы
в столбцах хранится данные Varchar


а что, варчары не однозначно сравниваются операторами > и < ?
21 июн 11, 13:59    [10846727]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Чтобы получилось ещё круче для SQL2008, слегка изменю:
SET NOCOUNT ON;

DECLARE @T TABLE(A_ID INT,O_ID INT);
INSERT @T(A_ID,O_ID)VALUES
 (3,1)
,(2,2)
,(1,3);

SELECT * FROM @T;

WITH CTE(N) AS
(
 SELECT ROW_NUMBER() OVER
  (
   PARTITION BY
   (SELECT MAX(V)FROM(VALUES(A_ID),(O_ID))T(V)),
   (SELECT MIN(V)FROM(VALUES(A_ID),(O_ID))T(V))
   ORDER BY O_ID
  )
 FROM @T
)
DELETE CTE
WHERE N>1;

SELECT * FROM @T;
21 июн 11, 14:00    [10846736]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
bacalavr
Dimitriy_89
Спасибо алгоритм хороший но проблема в том что 1 3 я написал для простаты описания проблеммы
в столбцах хранится данные Varchar


а что, варчары не однозначно сравниваются операторами > и < ?
Действительно.

Dimitriy_89, а чем же "алгоритм хороший", если Вы даже не попробовали?
И, кстати, версию сервера нам не сказали!
21 июн 11, 14:02    [10846760]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
Dimitriy_89
Member

Откуда:
Сообщений: 4
iap,

СПАСИБО ОГРОМНОЕ!!!! воспользовался вторым вариантом.
P.S. Сервер 2008 r2. первый вариант не прошёл по причине моей криворукости )).
21 июн 11, 14:29    [10847055]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Dimitriy_89
iap,

СПАСИБО ОГРОМНОЕ!!!! воспользовался вторым вариантом.
P.S. Сервер 2008 r2. первый вариант не прошёл по причине моей криворукости )).
CASE-то попроще и пошустрее будет. IMHO, конечно
21 июн 11, 14:38    [10847165]     Ответить | Цитировать Сообщить модератору
 Re: И опять дубликты  [new]
_ч_
Member

Откуда:
Сообщений: 1447
DECLARE @T TABLE(A_ID VARCHAR(1000),O_ID VARCHAR(1000));
INSERT @T(A_ID,O_ID)VALUES
 ('1', '3')
,('2','2')
,('3', '1'),
('4', '2'),
('2', '4');


SELECT A_ID, O_ID FROM(SELECT ROW_NUMBER() OVER(PARTITION BY [MAX], [MIN] ORDER BY O_ID) AS Num,
A_ID, O_ID
FROM(
select A_ID, O_ID, 
CASE WHEN A_ID>O_ID THEN A_ID ELSE O_ID END AS [MAX], 
CASE WHEN A_ID>O_ID THEN O_ID ELSE A_ID END AS [MIN]
FROM @t)T)Result
WHERE Num=1;
Вариант почти как у iap
21 июн 11, 14:49    [10847295]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить