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):
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:
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.