【问题标题】:Recursive select through 2 tables in SQL Server通过 SQL Server 中的 2 个表进行递归选择
【发布时间】:2023-03-11 23:39:01
【问题描述】:

对于 SSRS 中的生产报告,我需要在我们的 ERP 中显示基础材料,该基础材料可以包含多个级别。

我在 INVENTPRODMETHOD 表中有一个项目,其中有一个 ProdMethodId 字段,这与一个带有“支持项目”的 INVENTPRODSUPPITEM 表相关。根据在第一个表中找到的 ProdMethodId,我得到一个 SUPPLITEMID,我需要找出这个(新)项目的 ProdMethodId 在第一个表 INVENTPRODMETHOD 等中是什么。希望你能关注我...

我的要求是我需要知道最底层的基础材料。例如:

我想查找项目 100 的基础材料。在 DMO_INVENTPRODMETHOD 表中,我可以看到 PRODMETHODID = A123

在 DMO_INVENTPRODSUPPITEMS 中,它告诉我这个 PRODMETHODID A123 的 SUPPLITEMID 是 S200

现在我需要为 S200 做同样的事情。在 DMO_INVENTPRODMETHOD 中,当我在 DMO_INVENTPRODSUPPITEMS 中查找时,我得到 PRODMETHODID E123,SUPPLITEMID 是 S400

DMO_INVENTPRODMETHOD 中的 S400 具有 PRODMETHODID Z123,但该 PRODMETHODID 在 DMO_INVENTPRODSUPPITEM 中不存在

现在我知道我需要使用 PRODMETHODID Z123 在 DMO_INVENTPRODBASEITEMS 表中查找 ITEMID

CREATE TABLE DMO_INVENTPRODMETHOD (
    ITEMID VARCHAR (10) NOT NULL,
    PRODMETHODID VARCHAR (10) NOT NULL,
);

INSERT INTO [dbo].[DMO_INVENTPRODMETHOD] VALUES ('100', 'A123')
INSERT INTO [dbo].[DMO_INVENTPRODMETHOD] VALUES ('S200', 'E123')
INSERT INTO [dbo].[DMO_INVENTPRODMETHOD] VALUES ('S400', 'Z123')



CREATE TABLE DMO_INVENTPRODSUPPITEMS (
    SUPPLITEMID VARCHAR (10) NOT NULL,
    PRODMETHODID VARCHAR (10) NOT NULL,
);

INSERT INTO [dbo].[DMO_INVENTPRODSUPPITEMS] VALUES ('S200', 'A123')
INSERT INTO [dbo].[DMO_INVENTPRODSUPPITEMS] VALUES ('S400', 'E123')


CREATE TABLE DMO_INVENTPRODBASEITEMS (
    ITEMID VARCHAR (10) NOT NULL,
    PRODMETHODID VARCHAR (10) NOT NULL,
);
INSERT INTO [dbo].[DMO_INVENTPRODBASEITEMS] VALUES ('BAAAB10', 'Z123')

迈克

【问题讨论】:

  • 这里真正有用的是一些示例数据、所需的输出和表定义。
  • 在这种情况下“不工作”是什么意思?具体并举例说明。
  • 我添加了示例数据、表定义以使其更加清晰。感谢您的反馈!

标签: sql sql-server reporting-services ssrs-2008


【解决方案1】:

这是解决此问题的一种方法。

首先,将值标准化为父/子表。接下来,对标准化数据执行非常标准的递归 cte。最后,倒序得到链中的最后一个后代。

Sql Fiddle

DECLARE @DMO_INVENTPRODMETHOD  TABLE(ITEMID  VARCHAR (10) NOT NULL,PRODMETHODID VARCHAR (10) NOT NULL)
INSERT INTO @DMO_INVENTPRODMETHOD VALUES ('100', 'A123'),('S200', 'E123'),('S400', 'Z123')

DECLARE @DMO_INVENTPRODSUPPITEMS TABLE(SUPPLITEMID  VARCHAR (10) NOT NULL,PRODMETHODID  VARCHAR (10) NOT NULL)
INSERT INTO @DMO_INVENTPRODSUPPITEMS VALUES ('S200', 'A123'),('S400', 'E123')

DECLARE @DMO_INVENTPRODBASEITEMS TABLE(ITEMID VARCHAR (10) NOT NULL,PRODMETHODID VARCHAR (10) NOT NULL)
INSERT INTO @DMO_INVENTPRODBASEITEMS VALUES ('BAAAB10', 'Z123')

DECLARE @ITEMID NVARCHAR(10) = '100'

;WITH CombinedData AS
(
    SELECT DataLevel=1, ParentID=ITEMID, ChildID=PRODMETHODID  FROM @DMO_INVENTPRODMETHOD
    UNION
    SELECT DataLevel=2, ParentID=PRODMETHODID ,ChildID=SUPPLITEMID  FROM @DMO_INVENTPRODSUPPITEMS
    UNION
    SELECT DataLevel=3, ParentID=PRODMETHODID ,ChildID=ITEMID  FROM @DMO_INVENTPRODBASEITEMS
) 
,RecursiveWalk AS
 (
    SELECT  ParentID, ChildID,Level=1 FROM CombinedData WHERE  DataLevel=1 AND ParentID=@ITEMID

    UNION ALL

    SELECT D.ParentID,D.ChildID, Level=R.Level+1
    FROM
        RecursiveWalk R
        INNER JOIN  CombinedData D ON D.ParentID=R.ChildID
)
,ResultReverseOrdered AS
(
    SELECT *, RowNumber = ROW_NUMBER() OVER(ORDER BY Level DESC) FROM RecursiveWalk
)
SELECT
    PRODMETHODID = ParentID,
    Level 
FROM    
    ResultReverseOrdered
WHERE
    RowNumber = 1

【讨论】:

  • Thnx Ross,这就是我要找的。仍然需要将其转换为我的 ERP 场景,但我认为这会起作用。
  • 我很高兴能帮上忙。如果工作令您满意,也许您可​​以释放赏金:)
  • 如您所愿!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2021-05-12
  • 2016-06-17
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
相关资源
最近更新 更多