最有效的方法,使用来自同一表的结果搜索SQL表,直到找到最终值

时间:2019-07-01 14:09:57

标签: sql db2

table

在上面的图像中,它表示一个SQL表,我想搜索1111并检索其最后一个替换数字,该数字应为4444,其中1111只是一个由单个数字4444替换的数字。那么我想搜索5555应该返回(6666,9999,8888)。 NB 9999取代了7777。

因此1111是单个零件号多次被替换,5555是具有多个零件细分的组号,其中一个替换号在(7777 >> 9999)。

最快,最有效的方法是什么?

  1. 可能的话,使用SQL提高效率。

  2. 如果无法在SQL中使用,则可以从PHP中使用。

我尝试过的事情:

1)while循环。但需要访问数据库1000次才能替换1000个数字。 ##效率太低。

2)

SELECT C.RPLPART 
FROM TABLE A 
  left join  TABLE B on A.RPLPART=B.PART# 
  left join TABLE C on B.RPLPART=C.PART#  
WHERE A.PART#='1111' ##Unable to know when last number is reached.

2 个答案:

答案 0 :(得分:1)

递归公用表表达式(CTE)似乎是问题所在。

类似的东西...

with rcte (lvl, topPart, part#, rplpart) as 
  (select 1 as lvl, part#, part#, rplpart
   from MYTABLE
   union all
   select p.lvl + 1, p.topPart, c.part#, c.rplpart
   from rcte p, MYTABLE c
   where p.rplpart = c.part#
)
select topPart, rplpart 
from rcte
where toppart = 1111
order by lvl desc
fetch first row only;

答案 1 :(得分:1)

您可以使用递归CTE为给定的起始零件ID生成完整的替换链,然后将结果限制为parts#列中不存在的那些:

WITH cte(part) AS
  (SELECT replpart FROM parts WHERE part# = 1111
   UNION ALL
   SELECT parts.replpart FROM parts, cte WHERE parts.part# = cte.part)
SELECT DISTINCT part
FROM cte
WHERE part NOT IN (SELECT part# FROM parts);

Fiddle example