sql查找相似记录的重复项

jhdbpxl9  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(377)

我需要找到“like”记录的副本。这就是我的意思。
我有目录号作为字符,像'123'或'a1b2c3'生产突然开始填充这些10个地方,所以新的ID进入0000123,所以他们在比赛中把数据放进去,这是“技术上”独特的。
我需要做的是找出所有的记录,有匹配之间的非填充和填充。
我试过这个

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

这给了我一个重复的计数(有用,但不够有用)
我想我需要一个工会,但我不清楚该怎么办。感谢您的帮助
所以用英语说吧
查找长度为10的所有记录,并查找最右边的字符与10个记录中最右边的字符匹配的任何其他记录。
所以呢

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

我想我正在尝试匹配左边不是“0”的任何字符
db2版本10

afdcj2ne

afdcj2ne1#

使用自联接:

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 长度为10的s和任何匹配项 sku 通过移除前导 0 s。

f0ofjuux

f0ofjuux2#

你可以垫上垫子 id 首先,然后很容易找到重复的。例如:

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/os)。如果 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

相关问题