Induk akar untuk hierarki anak induk

Saya merujuk buku perangkat Gudang Data Kimball dan ingin menerapkan hierarki induk anak. Saya memberikan kode di bawah ini untuk membuat tabel yang berisi data induk anak:

   /****** 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)

Lalu saya menggunakan kueri di bawah ini:

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 

Saya mendapatkan output di bawah ini (Tabel-1):

masukkan deskripsi gambar di sini

Saya memerlukan keluaran berikut (Tabel-2), selain keluaran saat ini yang ditunjukkan di atas, yaitu bagian yang disorot dengan menyertakan induk root, dalam hal ini saya memfilter Company_key=103:

masukkan deskripsi gambar di sini

Dalam kueri jangkar, saya telah memasukkan kode keras Company_Key='103' tetapi saya ingin menggunakan di sini ID ini secara dinamis berasal dari tabel lain, bergabung ke kiri. Jadi untuk setiap Company_Key di tabel itu, saya harus mendapatkan output yang benar yang difilter dalam format seperti yang ditunjukkan pada tabel-2.


person user7256821    schedule 16.07.2020    source sumber


Jawaban (1)


Jika saya memahaminya dengan benar, Anda cukup mengubah CTE untuk mengambil daftar apa pun yang Anda inginkan:

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;

Ini adalah biola db.

person Gordon Linoff    schedule 16.07.2020
comment
Cemerlang. Saya pikir Anda menjawab pertanyaan saya. Saya akan menggunakan dalam kasus asli dan mengembalikannya jika diperlukan bantuan lebih lanjut. Ngomong-ngomong, bagaimana cara memposting ini sebagai jawaban? - person user7256821; 16.07.2020