我有一个数据库,产品每周都会更新产品。每个产品都有一列UniqueID,供应商,添加日期,产品编号和ReplacementID。当产品更新时,它会带有一个新的UniqueID但同样的supplierID和产品编号,因此我会使用ReplacementID更新旧产品以指向新产品(相同的产品编号,新的UniqueID)。我发现有些供应商没有简化他们的产品编号,我需要将旧版本与新版本相匹配。 例子:
旧:BRB-410-12
新:BRB-410
旧:SM999 BL
新:SM999
旧:5555i
新:5555
旧:346blk
新:346
基本上我需要匹配旧产品编号为1-4“项目”(空格,短划线,数字或字母)的位置比新的更长。这是我正在尝试的:
select a.UniqueId as OLDID, b.UniqueId as NEWID
from productdata a, productdata b
where a.ProdNum REGEXP CONCAT('^', b.ProdNum, '.?.?.?.?')
and b.UniqueId > a.UniqueId
and b.DateAdded != a.DateAdded
and a.DateAdded != '2013-03-11'
and a.ProdNum !=''
and a.ReplacementId IS NULL
and b.ReplacementId IS NULL
and b.ProdNum !=''
and a.Supplier = b.Supplier);
现在我的数据库大约有800,000个产品,其中400,000个产品已经有了ReplacementID。我在我的本地计算机临时数据库上运行它,所以这是唯一运行的查询,但在20小时后它仍然无法运行。你能想到一个更好的查询来捕捉它们吗?
我对所有使用过的列都有索引。