Запрос на возврат строк со всеми равными столбцами, кроме ключа - PullRequest
2 голосов
/ 10 февраля 2012

У меня есть таблица с некоторыми строками, которые являются дубликатами других, кроме ключевого столбца. Мне нужно вернуть список всех значений ключей, которые имеют дубликаты. Например:

(key)
ID       Column_B Column_C Column_D Column_E
1        foo      bar      beyond   belief       
2        foo      bar      beyond   belief  
3        blah     blah2    blah3    blah4       
4        ho       hum      di       dum       
5        foo      bar      beyond   belief 

В этом случае мне нужно, чтобы запрос возвратил 1, 2, and 5, так как все эти ключи имеют повторяющиеся значения во всех остальных столбцах.

Я могу сделать это достаточно легко в этом упрощенном примере, используя соединение следующим образом:

SELECT ID
FROM mytable t
INNER JOIN (SELECT Column_B, Column_C, Column_D, Column_E
            FROM mytable
            GROUP BY Column_B, Column_C, Column_D, Column_E
            HAVING COUNT(*) > 1) t2
ON t.Column_B = t2.Column_B
AND t.Column_C = t2Column_C
AND t.Column_D = t2.Column_D
AND t.Column_E = t2.Column_E

Но моя «настоящая» таблица имеет много столбцов (более 20), и это может увеличиться (это денормализованная таблица для быстрого создания отчетов), поэтому я надеялся, что кто-то может придумать:

  • что-то более динамичное, или
  • что-то немного менее громоздкое, чем объединение во всех столбцах.

SQL или PL / SQL в порядке ..

Ответы [ 4 ]

1 голос
/ 10 февраля 2012

На оракуле я бы попробовал что-то вроде этого:

select column_a
     , t1.column_b || t1.column_c ... concat_value
from   my_table t1
where  t1.column_b || t1.column_c ... in 
       ( select t2.column_b || t2.column_c ... inner_concat_value
         from   mytable t2
         group by t2.column_a || t2.column_b ...
         having count(*) > 1
       )

Я не запускал этот запрос, но, возможно, он дает вам представление.Пожалуйста, подумайте о разделителе между полями, иначе результаты могут быть неверными.

0 голосов
/ 10 февраля 2012

Выберите их в порядке столбцов, указав ключ в качестве последнего столбца.

Сортируйте так, чтобы дубликаты оказались рядом друг с другом.

Использовать LAG, чтобы исследовать прилагательные строки в наборе результатов, стяните ключи и сохраните их на столе.

Сообщите результаты DISTINCT этой таблицы.

0 голосов
/ 10 февраля 2012

Если вы не хотите использовать динамический SQL и не хотите объединять все столбцы, с чем я согласен, то лучше всего хешировать все остальные столбцы, исключая первичный ключ при входе.в таблицу, а затем присоединиться исключительно к этому;есть абсолютно незначительное изменение, которое вы получите, хотя дубликат.Должно работать что-то вроде следующего:

function checksum( P_Str in varchar2 ) return varchar2 is

   l_CSum dbms_obfuscation_toolkit.raw_checksum;

begin

   if P_Str is null then
      return null;
   else
      dbms_obfuscation_toolkit.md5( input => utl_raw.cast_to_raw(P_Str)
                                  , checksum => l_CSum );
      return l_CSum;
   end if;

end checksum;
0 голосов
/ 10 февраля 2012

Если у вас есть stragg (или похожая функция), попробуйте это:

select stragg(to_char(ColumnA))
from my_table
group by Column_B, Column_C, Column_D, Column_E
having count(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...