而循环SQL具有NULL条件

时间:2015-03-16 12:11:03

标签: sql-server while-loop

我会简化这一点,希望有人可以提供帮助:)

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循环中实现这一点

有什么想法吗?

1 个答案:

答案 0 :(得分: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