ภาษา sql recursive query เพื่อให้แผนกหัส

0

คำถาม

ฉันต้องการสร้างรายการของผู้ใช้'uruguay. kgm หัสโปรแกรมกันซะหน่อย ถ้าผู้ใช้ไม่ได้มีรหัสเอาของมันจัดการรหัสและดังนั้นในห้องลำดับชั้นในผังต้นไม้.

ที่เริ่มต้นโต๊ะดูเหมือนนี้:

manager emp     code
-----------------------
boss    subboss AAA
boss    subsub  SUBCODE
subboss john    ABC
subboss alan    (null)
(null)  boss    ZZZ
subsub  steve   (null)
steve   rick    (null)

CREATE TABLE Users
(
     [manager] varchar(10), 
     [emp] varchar(10), 
     [code] varchar(10)
);
    
INSERT INTO Users ([manager], [emp], [code])
VALUES
    ('boss', 'subboss', 'AQQ'),
    ('boss', 'subsub', 'SUBSUB'),
    ('subboss', 'john', 'ABC'),
    ('subboss', 'alan', null),
    (null, 'boss', 'ZZZ'),
    ('subsub', 'steve', null),
    ('steve', 'rick', null);

ที่ต้องการผลลัพธ์นี้คือ:

manager emp     code
------------------------
boss    subboss AAA
boss    subsub  SUBCODE
subboss john    ABC
subboss alan    AAA
(null)  boss    ZZZ
subsub  steve   SUBCODE
steve   rick    SUBCODE

ของความพยายามครั้งแรกคือ:

select 
    manager, emp,
    coalesce(code, (select code from Users u1 where u.manager = u1.code))
from 
    Users u;

แต่มันกลับมาเพียงโดยตรงจัดการรหัส

ฉันจะซาบซึ้งมากอนเคล็ดลับสะบัดวิธีที่จะทำมัน recursively กับ CTE.

1

คำตอบที่ดีที่สุด

5

ลองบางอย่างเหมือนนี้:

WITH Hierarchy AS
(
    -- create the "anchor" - the toplevel node(s)
    SELECT
        u.emp, u.manager, u.code, 0 AS Level
    FROM
        Users u
    WHERE
        u.manager IS NULL

    UNION ALL

    -- recursive part - join subordinate to manager, one level up
    SELECT
        u.emp, u.manager, COALESCE(u.code, h.code), h.Level + 1
    FROM
        Hierarchy h
    INNER JOIN
        Users u ON u.manager = h.emp
)
SELECT
    *
FROM
    Hierarchy

นี่ผลตรวจในวันที่เหมือนนี้:

emp     manager code    Level
-----------------------------
boss    NULL    ZZZ      0
subboss boss    AQQ      1
subsub  boss    SUBSUB   1
steve   subsub  NULL     2
rick    steve   NULL     3
john    subboss ABC      2
alan    subboss NULL     2
2021-10-25 09:55:10

ขอบคุณแต่มันไม่ใช่สิ่งที่ฉันต้องการ ฉันแค่อยากจะมีรหัสคอลัมน์ populated กับผู้จัดการคือรหัสถ้ามันมีโพรโทคอล aimcomment
Mark

@มาร์คุณแค่ต้องการจะแทนที่ u.code กับ coalesce(u.code, h.code) ใน resursive นส่วนหนึ่ง
Salman A

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่