رضا عربلو
چهارشنبه 03 بهمن 1386, 22:18 عصر
نمی توانم از لوپ CTE خارج شوم.
به قول فرنگی ها I’m new in CTE :(
برای اینکه مسئله را بهتر توضیح دهم یک جدول دارم با نام tDocuments با تقریباً 700 رکورد. به شکل
USE [BNPP]
GO
/****** Object: Table [dbo].[tDocuments] Script Date: 01/08/2008 15:48:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tDocuments](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DocumentCode] [nvarchar](255) NULL,
[ReferenceCode] [nvarchar](255) NULL,
CONSTRAINT [PK_tDocuments] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
که درآن فیلد DocumentCode کد مدرک و فیلد ReferenceCode نیز کد مدرکی است که مدرک فوق به آن ارجاع داده شده است.
حالا می خواهم تمام مدارکی که به نحوی (حتی با طی چند مرحله) به مدرک با کد ’21.BU.1.BA.ZK.RDR.001_1’ ارجاع داده شده اند و یا مدرک فوق به آنها ارجاع داده شده است را پیدا کنم.
کوئری زیر را نوشتم.
WITH CTE_GETALLRelatedDocuments (DocumentCode) AS
(
SELECT e.DocumentCode AS DocumentCode FROM tDocuments AS e WHERE e.ReferenceCode='21.BU.1.BA.ZK.RDR.001_1'
UNION ALL
SELECT e.ReferenceCode AS DocumentCode FROM tDocuments AS e WHERE e.DocumentCode='21.BU.1.BA.ZK.RDR.001_1'
UNION ALL
SELECT e.ReferenceCode AS DocumentCode FROM tDocuments AS e INNER JOIN CTE_GETALLRelatedDocuments AS cte ON e.DocumentCode = cte.DocumentCode
UNION ALL
SELECT e.DocumentCode AS DocumentCode FROM tDocuments AS e INNER JOIN CTE_GETALLRelatedDocuments AS cte ON e.ReferenceCode = cte.DocumentCode
)
SELECT DocumentCode
FROM CTE_GETALLRelatedDocuments
OPTION (MAXRECURSION 800)
GO
ولی متاسفانه نمی توانم از لوپ CTE خارج شوم.
به قول فرنگی ها I’m new in CTE :(
برای اینکه مسئله را بهتر توضیح دهم یک جدول دارم با نام tDocuments با تقریباً 700 رکورد. به شکل
USE [BNPP]
GO
/****** Object: Table [dbo].[tDocuments] Script Date: 01/08/2008 15:48:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tDocuments](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DocumentCode] [nvarchar](255) NULL,
[ReferenceCode] [nvarchar](255) NULL,
CONSTRAINT [PK_tDocuments] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
که درآن فیلد DocumentCode کد مدرک و فیلد ReferenceCode نیز کد مدرکی است که مدرک فوق به آن ارجاع داده شده است.
حالا می خواهم تمام مدارکی که به نحوی (حتی با طی چند مرحله) به مدرک با کد ’21.BU.1.BA.ZK.RDR.001_1’ ارجاع داده شده اند و یا مدرک فوق به آنها ارجاع داده شده است را پیدا کنم.
کوئری زیر را نوشتم.
WITH CTE_GETALLRelatedDocuments (DocumentCode) AS
(
SELECT e.DocumentCode AS DocumentCode FROM tDocuments AS e WHERE e.ReferenceCode='21.BU.1.BA.ZK.RDR.001_1'
UNION ALL
SELECT e.ReferenceCode AS DocumentCode FROM tDocuments AS e WHERE e.DocumentCode='21.BU.1.BA.ZK.RDR.001_1'
UNION ALL
SELECT e.ReferenceCode AS DocumentCode FROM tDocuments AS e INNER JOIN CTE_GETALLRelatedDocuments AS cte ON e.DocumentCode = cte.DocumentCode
UNION ALL
SELECT e.DocumentCode AS DocumentCode FROM tDocuments AS e INNER JOIN CTE_GETALLRelatedDocuments AS cte ON e.ReferenceCode = cte.DocumentCode
)
SELECT DocumentCode
FROM CTE_GETALLRelatedDocuments
OPTION (MAXRECURSION 800)
GO
ولی متاسفانه نمی توانم از لوپ CTE خارج شوم.