SQL найти дубликаты записей LIKE - PullRequest
1 голос
/ 27 мая 2020

Мне нужно найти дубликаты "похожих" записей. Вот что я имею в виду.

У меня номера каталогов в виде символов, например, «abc123» или «a1b2c3», производство внезапно начало заполнять их до 10 мест, поэтому новые идентификаторы go в виде 0000abc123, поэтому они участвуют в гонках, вводя данные, и это «технически» уникально.

Что мне нужно сделать, так это выследить все записи, у которых есть совпадения между незаполненными и заполненными.

Я пробовал это

SELECT p.sku, COUNT(p.id)
FROM  products p
GROUP BY p.sku
HAVING COUNT(p.id) > 1

Это дает мне количество дубликатов (полезно, но недостаточно полезно)

Я думаю, мне нужен UNION, но я не понимаю, как действовать. Приветствуется ЛЮБАЯ помощь. длина 10 записей.

так что

00000asdfg would match 'asdfg' but would not match 'sdfg'

Думаю, я пытаюсь сопоставить любые символы, НЕ '0' слева

DB2 v10

Ответы [ 2 ]

1 голос
/ 27 мая 2020

С самосоединением:

SELECT p1.id, p1.sku, p2.sku matching_sku
FROM products p1 LEFT JOIN products p2
ON p2.sku = TRIM(LEADING '0' FROM p1.sku)  
WHERE LENGTH(p1.sku) = 10

Этот запрос вернет все строки, содержащие sku s с длиной = 10 и любые совпадающие sku s, удалив начальные 0 s.

1 голос
/ 27 мая 2020

Вы можете сначала заполнить id s, а затем легко найти дубликаты. Например:

select
  pid
from (
  select
    sku,
    id,
    lpad(id, 10, '0') as pid
  from products
) x
group by pid
having count(pid) > 1

См. Пример выполнения в DB <> Fiddle .

Вы не упоминаете архитектуру вашей базы данных DB2 (iSeries, LUW, z /ОПЕРАЦИОННЫЕ СИСТЕМЫ). Если LPAD() недоступен в вашей архитектуре, вы можете использовать комбинацию REPEAT() и RIGHT(), чтобы получить тот же результат. Например:

select
  pid
from (
  select
    sku,
    right(repeat('0', 10) || id, 10) as pid
  from products
) x
groub by pid
where count(pid) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...