我需要找到“喜欢”记录的重复项。这就是我的意思。
我将目录号作为字符,例如“ abc123”或“ a1b2c3” 生产突然开始将这些填充到10个位置,因此新的id会作为0000abc123 因此,他们可以参加将数据放入其中的竞赛,并且在技术上是独一无二的。
我需要做的是查找所有未填充和已填充之间具有匹配项的记录。
我已经尝试过
SELECT p.sku, COUNT(p.id)
FROM products p
GROUP BY p.sku
HAVING COUNT(p.id) > 1
哪个可以给我带来重复的次数(有用,但不够有用)
我认为我需要一个UNION,但不清楚如何进行。 感谢您的任何帮助
所以用英语陈述
查找所有长度为10的记录,并找到其他最右边的字符与长度为10的记录的最右边字符匹配的记录。
如此
00000asdfg would match 'asdfg' but would not match 'sdfg'
我想我想匹配左侧不是'0'的任何字符
DB2 v10
答案 0 :(得分:1)
您可以先填充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
答案 1 :(得分:1)
使用自我加入:
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的sku
行和所有匹配的0
行。