1

我有一张这样的桌子

ID  L1          L2              L3                  OBId                    OBDesc      ParentId
1   3501-072                                        3501-072-0102           building1   ?
2   3501-072    3501-072-0102                       3501-072-0102-0001      room2       ?
3   3501-072    3501-072-0102   3501-072-0102-0001  3501-072-0102-0001-0001 table1      ?
4   3501-072    3501-072-0102   3501-072-0102-0001  3501-072-0102-0001-0002 chair1      ?
5   3501-072    3501-072-0102                       3501-072-0102-0003      room3       ?
6   3501-072    3501-072-0102   3501-072-0102-0003  3501-072-0102-0003-0001 Table2      ?
7   3501-072    3501-072-0102   3501-072-0102-0003  3501-072-0102-0003-0002 chair3      ?

结构基本上是,table1属于bulding1中的room2。

L1、L2、L3 等列是代表这一点的层次结构级别。

OBId 是层次结构中每个节点的唯一编号

我需要一个查询,该查询可以使用 ID 填充 ParentId,以便在节点中添加下一个 nevel。

欢迎任何想法...

我有一张这样的桌子

ID  L1          L2              L3                  OBId                    OBDesc      ParentId
1   3501-072                                        3501-072-0102           building1   ?
2   3501-072    3501-072-0102                       3501-072-0102-0001      room2       ?
3   3501-072    3501-072-0102   3501-072-0102-0001  3501-072-0102-0001-0001 table1      ?
4   3501-072    3501-072-0102   3501-072-0102-0001  3501-072-0102-0001-0002 chair1      ?
5   3501-072    3501-072-0102                       3501-072-0102-0003      room3       ?
6   3501-072    3501-072-0102   3501-072-0102-0003  3501-072-0102-0003-0001 Table2      ?
7   3501-072    3501-072-0102   3501-072-0102-0003  3501-072-0102-0003-0002 chair3      ?

结构基本上是,table1属于bulding1中的room2。

L1、L2、L3 等列是代表这一点的层次结构级别。

OBId 是层次结构中每个节点的唯一编号

我需要一个查询,该查询可以使用节点中下一个 nevel 的 ID 填充 ParentId。

欢迎任何想法...

- - -更新 - - -

为了简化示例,我没有提到一共有 10 个潜在级别

4

2 回答 2

2

如果 L2 和 L3 中有空值而不是空字符串,则可以使用 COALESCE

SELECT COALESCE(L3,L2,L1) as Parent FROM tablename

否则你可以使用case语句

SELECT CASE WHEN isnull(L2,'') = '' then L1
            WHEN isnull(L3,'') = '' then L2
            ELSE L3
       END as Parent 
FROM tablename

编辑 更新看起来像:

update tablename 
SET parent = CASE WHEN isnull(L2,'') = '' then L1
                WHEN isnull(L3,'') = '' then L2
                ELSE L3
             END
于 2013-07-13T08:40:59.063 回答
1

假设 L1、L2、L3 结构是固定的(意味着层次结构的深度不超过 3 级),我将使用以下方法:只需编写一个查询来更新层次结构的每一级的值。如果层次结构达到 4 或 5 级,则这种方法会失效,因为查询开始变得笨拙,但它应该适用于 3 级。如果我必须支持更多级别的层次结构(或可变级别),我可能会想出一个更通用的解决方案(可能会使用 a CURSOR)。

我整理了以下示例,它应该可以为您提供所需的结果。此示例假定 L2 和 L3 为空白 ('') 而不是 NULL。将这些放在一起时我注意到的一件事是您提供的示例数据似乎无效(记录 2 和 5 的 L1 和 L2 相同,这意味着子记录可能有 2 个父记录),所以我在我的文章中更正了它。

DECLARE @myTable AS TABLE
(
    ID INT,
    L1 VARCHAR(50),
    L2 VARCHAR(50),
    L3 VARCHAR(50),
    OBId VARCHAR(50),
    OBDesc VARCHAR(50),
    ParentID INT NULL
)
INSERT INTO @myTable VALUES(1, '3501-072', '', '', '3501-072-0102', 'building1', NULL)
INSERT INTO @myTable VALUES(2, '3501-072', '3501-072-0102', '', '3501-072-0102-0001', 'room2', NULL)
INSERT INTO @myTable VALUES(3, '3501-072', '3501-072-0102', '3501-072-0102-0001', '3501-072-0102-0001-0001', 'table1', NULL)
INSERT INTO @myTable VALUES(4, '3501-072', '3501-072-0102', '3501-072-0102-0001', '3501-072-0102-0001-0002', 'chair1', NULL)
INSERT INTO @myTable VALUES(5, '3501-072', '3501-072-0103', '', '3501-072-0103-0003', 'room3', NULL)
INSERT INTO @myTable VALUES(6, '3501-072', '3501-072-0103', '3501-072-0103-0003', '3501-072-0102-0003-0001', 'Table2', NULL)
INSERT INTO @myTable VALUES(7, '3501-072', '3501-072-0103', '3501-072-0103-0003', '3501-072-0102-0003-0002', 'chair3', NULL)

--Update records with no parent ID
UPDATE @myTable SET ParentID = NULL WHERE L2 = '' AND L3 = ''

--Update first level
UPDATE @myTable 
SET ParentID = (
    SELECT ID 
    FROM @myTable T2 
    WHERE 
        T2.L1 = T1.L1 
        AND T2.L2 = '' 
        AND T2.L3 = ''
) 
FROM @myTable T1
WHERE T1.L2 <> '' AND T1.L3 = ''

--Update second level
UPDATE @myTable 
SET ParentID = (
    SELECT ID FROM @myTable T2 
    WHERE 
        T2.L1 = T1.L1 
        AND T2.L2 = T1.L2 
        AND T2.L3 = ''
        AND T1.L2 <> ''
) 
FROM @myTable T1
WHERE T1.L2 <> '' AND T1.L3 <> ''

--Select results
SELECT ID, L1, L2, L3, ParentID FROM @myTable

希望有帮助。

于 2013-07-13T09:29:59.610 回答