【问题标题】:most effecient way to search SQL table using result from same table until final value is found使用同一表中的结果搜索 SQL 表的最有效方法,直到找到最终值
【发布时间】:2019-07-01 23:59:38
【问题描述】:

在上图中代表一个 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.

【问题讨论】:

  • 注意:描述列实际上引用了 PART# 列中的部件号。
  • 听起来你想要一个递归 cte。

标签: sql db2


【解决方案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;

【讨论】:

    【解决方案2】:

    您可以使用递归 CTE 执行此操作,该 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

    【讨论】:

    • 好的,这部分适用于我想要的。在更换号码的情况下,它可以工作。但请添加我提供的所有数据,因为我无法保存到您的小提琴示例中。我还需要例如 5555 如果搜索应该提供(6666,7777 替换为 9999,8888)>>> 所以最终结果将是(6666,9999,8888)。使用您当前的代码,它仅给出 9999,基于我的问题是正确的,但是我没有制定最初的问题来立即反映所有这些。但到目前为止在正确的道路上。
    • @carlsonlv 您应该在问题中包含类似的内容,因为该要求会大大改变答案。
    • 谢谢。我修改了问题。希望它不会太混乱。
    • @carlsonlv 在那个小提琴中工作正常,这是我唯一可以访问的 db2 设置。
    • 我如何将您的代码应用于整个数字列表而不是一次一个数字?
    猜你喜欢
    • 2015-08-19
    • 2021-10-13
    • 1970-01-01
    • 2012-03-05
    • 2011-02-11
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2021-09-14
    相关资源
    最近更新 更多