รูทพาเรนต์สำหรับลำดับชั้นพาเรนต์รอง

ฉันกำลังอ้างถึงหนังสือชุดเครื่องมือคลังข้อมูลของ Kimball และต้องการใช้ลำดับชั้นพาเรนต์รอง ฉันให้โค้ดด้านล่างเพื่อสร้างตารางที่มีข้อมูลหลัก:

   /****** Object:  Table [dbo].[COMPANY]    Script Date: 07/16/2020 15:05:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[COMPANY](
    [COMPANY_KEY] [int] NOT NULL,
    [COMPANY_NAME] [varchar](50) NULL,
    [PARENT_KEY] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (100, N'MICROSOFT', NULL)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (101, N'SOFTWARE', 100)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (102, N'CONSULTING', 101)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (103, N'PRODUCTS', 101)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (104, N'OFFICE', 103)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (105, N'VISIO', 104)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (106, N'VISIO EUROPE', 105)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (107, N'BACK OFFICE', 103)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (108, N'SQL SERVER', 107)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (109, N'OLAP SERVICES', 108)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (110, N'DTS', 108)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (111, N'REPOSITORY', 108)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (112, N'DEVELOPER TOOLS', 103)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (113, N'WINDOWS', 103)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (114, N'ENTERTAINMENT', 103)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (115, N'GAMES', 114)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (116, N'MULTIMEDIA', 114)
INSERT [dbo].[COMPANY] ([COMPANY_KEY], [COMPANY_NAME], [PARENT_KEY]) VALUES (117, N'EDUCATION', 101)

จากนั้นฉันใช้แบบสอบถามด้านล่าง:

WITH REC (Root_ID,Level,Company_key,Parent_key,Company_Name)

As
(
Select 
t1.COMPANY_KEY,
1,
t1.COMPANY_KEY,
t1.PARENT_KEY,
t1.COMPANY_NAME
from company t1
where t1.PARENT_KEY ='103'

Union All

Select 
REC.Root_ID,
REC.Level+1,
REC_PLUS1.COMPANY_KEY,
REC_PLUS1.PARENT_KEY,
REC_PLUS1.COMPANY_NAME

from COMPANY as REC_PLUS1, REC
where REC.Company_key=REC_PLUS1.PARENT_KEY
)

Select S1.COMPANY_Key, S1.Parent_key,Level as Depth_from_Parent

from REC S1
left outer join COMPANY t1
on S1.PARENT_KEY=t1.Company_key 

ฉันได้ผลลัพธ์ต่ำกว่า (ตารางที่ 1):

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการเอาต์พุตต่อไปนี้ (ตารางที่ 2) นอกเหนือจากเอาต์พุตปัจจุบันที่แสดงด้านบน เช่น ส่วนที่ไฮไลต์โดยรวมรูทพาเรนต์ ในกรณีนี้ ฉันกรองสำหรับ Company_key=103:

ป้อนคำอธิบายรูปภาพที่นี่

ในแบบสอบถามแบบจุดยึด ฉันได้ป้อน Company_Key='103' แบบฮาร์ดโค้ดแล้ว แต่ฉันต้องการใช้ ID นี้แบบไดนามิกที่มาจากตารางอื่น โดยเหลือการเข้าร่วม ดังนั้นสำหรับแต่ละ Company_Key ในตารางนั้น ฉันควรได้รับการกรองผลลัพธ์ที่ถูกต้องในรูปแบบดังแสดงในตารางที่ 2


person user7256821    schedule 16.07.2020    source แหล่งที่มา


คำตอบ (1)


ถ้าฉันเข้าใจถูกต้อง คุณสามารถปรับแต่ง CTE เพื่อดึงรายการที่คุณต้องการได้:

with cte as (
       select company_key, company_name, company_key as parent_key, 0 as lev
       from company
       where company_key in (103, 107)  -- whatever list you want here
       union all
       select c.company_key, c.company_name, cte.parent_key, 1 + cte.lev
       from cte join
            company c
            on cte.company_key = c.parent_key
      )
select * 
from cte
order by parent_key, lev;

ที่นี่ คือ db‹›ซอ

person Gordon Linoff    schedule 16.07.2020
comment
ฉลาดหลักแหลม. ฉันคิดว่าคุณตอบคำถามของฉัน ฉันจะใช้ในกรณีดั้งเดิมและเปลี่ยนกลับหากต้องการความช่วยเหลือเพิ่มเติม ยังไงก็ตามจะโพสต์สิ่งนี้เป็นคำตอบได้อย่างไร? - person user7256821; 16.07.2020