【问题标题】:While Loop SQL with NULL Condition带有 NULL 条件的 While 循环 SQL
【发布时间】:2015-05-18 13:08:12
【问题描述】:

我会简化一下,希望有人能帮忙:)

Table A 
ID  ItemID
1   12
2   13
3   14
4   15
5   16
6   17
11  19

Table B 
BID ItemID
8   10
7   11
6   12
9   13
10  14
11  17

将 A.ItemID 连接到 B.ItemID 以获取 BID 获得 BID 后,我需要将其加入 A.ID 以获取相关的 A.ItemID 以将其加入 B.BID 以获取下一个 B.ItemID 等等,直到 BID 为 NULL

因此,例如表 A ID 1 (ItemID 12) 将链接到 B.ItemID 12 以检索 BID 6,这将链接回表 A ID 6 以获取 ItemID 17,这将链接到表 B ItemID 17 以获取 BID 11 以链接回 ID 11 上的表 A 以获取 ItemID 19,依此类推,直到 BID 为 NULL

这可能有 10-15 层深,因此嵌套选择不够动态,所以我需要在 While 循环中实现这一点

请问有什么想法吗?

【问题讨论】:

  • 如果您要显示 BOM 和 BOMVERSION 表的重要部分的架构,这将有助于人们帮助您。
  • 你能用你尝试的 WHILE 循环编辑你的帖子吗?你从中得到了什么错误?
  • @Charlie1983 你能编辑你的问题吗(使用问题底部标签下方的“编辑”链接)并将 WHILE 循环放在问题中 - 作为评论完全不可读。跨度>
  • 您也可以使用递归 CTE 更有效地执行此操作。
  • HoneyBadger 如何使用 With 语句来执行此操作??

标签: sql-server while-loop


【解决方案1】:

试试这是否可行:

创建您的架构:

CREATE TABLE A
(
        ID  INT
    ,   ItemID INT
)


CREATE TABLE B
(
        BID INT
    ,   ItemID INT
)

INSERT INTO A (ID, ItemID)
VALUES  (1, 12)
,       (2, 13)
,       (3, 14)
,       (4, 15)
,       (5, 16)
,       (6, 17)
,       (11, 19)


INSERT INTO B (BID, ItemID)
VALUES  (8, 10)
,       (7, 11)
,       (6, 12)
,       (9, 13)
,       (10, 14)
,       (11, 17)

递归 CTE 和选择:

WITH Rcte AS
(
        SELECT      A.ID ID
        ,           A.ID ID_A
        ,           A.ItemID ItemID_A
        ,           B.BID BID_B
        ,           B.ItemID ItemID_B
        ,           1 Nr
        FROM        A
        JOIN        B
                ON  B.ItemID = A.ItemID

        UNION ALL

        SELECT      Rcte.ID
        ,           B.BID ID_A
        ,           A.ItemID ItemID_A
        ,           B.BID ID_B
        ,           B.ItemID ItemID_B       
        ,           Rcte.Nr + 1
        FROM        rCTE
        JOIN        B
                ON  B.ItemID = Rcte.ItemID_A
        JOIN        A
                ON  A.ID = B.BID
        WHERE       B.BID IS NOT NULL
)


SELECT      SOL.ID
,           SOL.ItemID
FROM        (
                SELECT      ID_A ID
                ,           ItemID_A ItemID
                ,           A.ID CTE_ID
                FROM        Rcte A

                UNION

                SELECT      BID_B
                ,           ItemID_B
                ,           B.ID    
                FROM        Rcte B
            ) SOL
WHERE       SOL.CTE_ID = 1

结果:

ID  ItemID
1   12
6   12
6   17
11  17
11  19

【讨论】:

    猜你喜欢
    • 2017-12-09
    • 2014-04-30
    • 1970-01-01
    • 2022-11-12
    • 2017-12-09
    • 1970-01-01
    • 2014-12-22
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多