И опять дубликты

Dimitriy_89
Дата: 21.06.2011 12:59:58
Доброго времени суток! Необходимо написать запрос на удаление дубликатов.
Есть таблица

A_ID, O_ID
3 1
2 2
1 3

Необходимо получить таблицу
A_ID, O_ID
3 1
2 2
Edkonst2008
Дата: 21.06.2011 13:10:03
Dimitriy_89
Доброго времени суток! Необходимо написать запрос на удаление дубликатов.
Есть таблица

A_ID, O_ID
3 1
2 2
1 3

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


Ну где тут были дубликаты?
Dimitriy_89
Дата: 21.06.2011 13:16:35
Edkonst2008,

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

1 3
и
3 1
приравнивается к повтору
WarAnt
Дата: 21.06.2011 13:42:38
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
iap
Дата: 21.06.2011 13:44:23
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;
НЕ ПРОВЕРЯЛ!
Dimitriy_89
Дата: 21.06.2011 13:55:59
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

не подойдет
bacalavr
Дата: 21.06.2011 13:59:35
Dimitriy_89
Спасибо алгоритм хороший но проблема в том что 1 3 я написал для простаты описания проблеммы
в столбцах хранится данные Varchar


а что, варчары не однозначно сравниваются операторами > и < ?
iap
Дата: 21.06.2011 14:00:12
Чтобы получилось ещё круче для 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;
iap
Дата: 21.06.2011 14:02:41
bacalavr
Dimitriy_89
Спасибо алгоритм хороший но проблема в том что 1 3 я написал для простаты описания проблеммы
в столбцах хранится данные Varchar


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

Dimitriy_89, а чем же "алгоритм хороший", если Вы даже не попробовали?
И, кстати, версию сервера нам не сказали!
Dimitriy_89
Дата: 21.06.2011 14:29:09
iap,

СПАСИБО ОГРОМНОЕ!!!! воспользовался вторым вариантом.
P.S. Сервер 2008 r2. первый вариант не прошёл по причине моей криворукости )).