在上面的图像中,它表示一个SQL表,我想搜索1111并检索其最后一个替换数字,该数字应为4444,其中1111只是一个由单个数字4444替换的数字。那么我想搜索5555应该返回(6666,9999,8888)。 NB 9999取代了7777。
因此1111是单个零件号多次被替换,5555是具有多个零件细分的组号,其中一个替换号在(7777 >> 9999)。
最快,最有效的方法是什么?
可能的话,使用SQL提高效率。
如果无法在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.
答案 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);