将 T-SQL 脚本转换为 DB2 等效脚本

问题描述 投票:0回答:1

背景

我们有一个大型路由表,用于根据零件号 (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 等效文件

sql sql-server db2
1个回答
0
投票

我会在 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),此方法将定位任何重叠范围(以便您可以对它们执行某些操作)。

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.