我有两张桌子:
Vehicles
make model modification
Audi A 5 A 5 2010 Sportsback 2.8
Audi A 5 A 5 2012 Quattro L
Audi A 5 A 5 Cabriolet
和
matchingModel
make model modContain modEnd finalModel
Audi A 5 Sportback A5 Sportback
Audi A 5 L A5 L
Audi A 5 A5
我的任务是通过查找匹配项来获得最合适的 finalModel(可以在下面的选择中看到)。首先我尝试加入表格
(SELECT
matchingModel.finalModel
FROM vehicles
LEFT OUTER JOIN matchingModel ON
matchingModel.TEXT1 = vehicles.make
AND vehicles.model = nvl(matchingModel.model,vehicles.model)
AND vehicles.modification LIKE decode(matchingModel.modContain, NULL, vehicles.modification, '%'||matchingModel.modContain||'%')
AND vehicles.modification LIKE decode(matchingModel.modEnd, NULL, vehicles.modification, '%'||' '||matchingModel.modEnd)
)
AS bestMatch
但这不起作用,因为 Sportsback 被发现为 sportsback,后来它被覆盖为简单的 A5,因为它也匹配。
所以接下来我通过“nvling”所有可能的选项来实现这一点:nvl(nvl(nvl(选择制造,模型适合和modContains在修改中间并且选项单元格为空),(选择制造,模型适合和modEnd 就像 Modification 的结尾,并且 modEnd 不为空),(选择适合的品牌和模型等等)) AS Bestmatch 这有效,但速度很慢(并且两个表都有超过 500k 的记录)。
这只是非常庞大的选择的一部分,因此很难以这种正常方式重写。无论如何,问题是,是否有任何最佳实践如何在 oracle 中快速获得最佳匹配?我遇到的问题是性能,或者值适合两次,或者“where”子句不起作用,因为我不知道 modContain 或 modEnd 是否为空。
先感谢您。对不起英语。