SQL: удаление повторяющихся записей - хотя и другого типа - PullRequest
7 голосов
/ 12 января 2012

Рассмотрим следующую таблицу:

TAB6
         A          B C
---------- ---------- -
         1          2 A
         2          1 A
         2          3 C
         3          4 D

Я считаю, записи {1,2, A} и {2, 1, A} являются дубликатами.Мне нужно выбрать и произвести следующий набор записей:

         A          B C                      A          B C
---------- ---------- -             ---------- ---------- -
         1          2 A         or           2          1 A
         2          3 C                      2          3 C
         3          4 D                      3          4 D

Я пробовал следующие запросы.Но безрезультатно.

select t1.*
from t6 t1
, t6 t2
where t1.a <> t2.b
and t1.b <> t2.a
and t1.rowid <> t2.rowid
/

         A          B C
---------- ---------- -
         1          2 A
         2          1 A
         2          1 A
         2          3 C
         3          4 D
         3          4 D

6 rows selected.

Или даже так:

 select *
 from t6 t1
 where exists (select * from t6 t2 where t1.a <> t2.b and t1.b <> t2.a)
/
         A          B C
---------- ---------- -
         1          2 A
         2          1 A
         2          3 C
         3          4 D

Оба не работали.

База данных будет Oracle 10g.Ищете чистое решение SQL.Мы ценим любую помощь.

Ответы [ 2 ]

6 голосов
/ 12 января 2012

Используйте функции GREATEST () и LEAST () для определения общих значений в нескольких столбцах.Затем используйте DISTINCT, чтобы распознать дубликаты.

select distinct least(a, b) as a
       , greatest(a, b) as b
       , c
from t6 

Это даст вам точный набор записей, который вы запрашивали.Но все станет сложнее, если вам нужно будет включить другие столбцы из T6.


"Но мне было интересно, будет ли это работать и для полей VARCHAR2?"

Да, но он будет использовать значения ASCII для определения порядка, что не всегда соответствует ожиданиям (или желаниям).

«Кроме того, моя таблица T6 может содержать десятки тысяч записей».

В современных условиях это не так много данных.DISTINCT вызовет сортировку, которая должна умещаться в памяти, если A и B не являются действительно длинными столбцами VARCHAR2 - но, вероятно, даже тогда.

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

create index t6_fbi on t6(least(a, b)
                           , greatest(a, b)
                           , c )
/

Но я бы действительно беспокоился, только если у вас есть настоящая проблема производительности с запросом.

0 голосов
/ 12 января 2012

Если порядок столбцов A и B не имеет значения и всегда содержит целое число, как насчет:

select distinct
  least(a, b) as a,
  greatest(a, b) as b,
  c
from
  t6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...