背景
我们有一个大型路由表,用于根据零件号 (PN) 查找人员。
路由表:
PN | 姓名 |
---|---|
51000 | 鲍勃 |
52000 | 鲍勃 |
61000 | 约翰 |
62000 | 约翰 |
给定的 PN 不会完全匹配路由表。我们希望它找到尽可能最接近的解决方案。
示例:SEARCHED_PART_NUMBER = 51235 -> 我们希望脚本来回答 Bob。
我们发现的最佳解决方案是使用循环递归搜索路由表,直到命中为止。
这是 T-SQL 脚本:
CREATE TABLE #temp_table
(
PN INT,
name VARCHAR(20),
);
DECLARE @Counter INT
SET @Counter = 5
WHILE (@Counter > 0)
BEGIN
INSERT INTO #temp_table
SELECT *
FROM Routing
WHERE LEFT(Routing.PN, @Counter) = LEFT([SEARCHED_PART_NUMBER], @Counter)
IF EXISTS (SELECT * FROM #temp_table)
BEGIN
BREAK;
END
SET @Counter = @Counter - 1
END
SELECT name, COUNT(name) count
FROM #temp_table
GROUP BY name
ORDER BY count
问题
虽然这段代码可以工作,但它使用的是错误的 SQL 语言...DB2 正是它所需要的。不幸的是,经过大量的努力,我们无法将其转换为 DB2 中的等效内容。
请求
将脚本转换为 DB2 等效文件
我会在 TSQL 和 DB2 中使用一种非常不同的方法,两者几乎(如果不完全一样)相同:
CREATE TABLE routing (
PN INTEGER,
Name VARCHAR(50)
);
CREATE INDEX IX_Routing_PN ON routing (PN);
INSERT INTO routing (PN, Name)
VALUES (51000, 'Bob'),
(52000, 'Bob'),
(61000, 'John'),
(62000, 'John'),
(1000,'overlap 1'),
(1100,'overlap 1'),
(1010,'overlap 2'),
(1110,'overlap 2');
CREATE VIEW my_routing AS
SELECT PN
, LEAD(PN, 1) OVER (
PARTITION BY Name ORDER BY PN
) AS NextPN
, Name
FROM routing;
SELECT
name
, pn
, nextpn
FROM my_routing
WHERE 51235 between PN and NextPN
OR 1050 between PN and NextPN
ORDER BY
name
, pn
, nextpn
姓名 | PN | 下一个 |
---|---|---|
鲍勃 | 51000 | 52000 |
重叠1 | 1000 | 1100 |
重叠2 | 1010 | 1110 |
除其他事项外(例如简单的 SQL),此方法将定位任何重叠范围(以便您可以对它们执行某些操作)。