مشکل با کوئری بازگشتی recursive query
با عرض سلام
من یک جدول دارم که شماره جدید و قدیم کالا ها رو نگهداری می کنه در sql server 2008 r2
CREATE TABLE [dbo].[Parts_PartsReplace](
[OldPartNum] [nvarchar](30) NOT NULL,
[NewPartNum] [nvarchar](30) NOT NULL,
[Dscp] [nvarchar](50) NULL,
CONSTRAINT [PK_Parts_PartsReplace] PRIMARY KEY CLUSTERED
(
[OldPartNum] ASC,
[NewPartNum] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
حالا می خوام با استفاده از کوئری بازگشتی تمام شماره های جایگزین رو پیدا کنم اول یک view ساختم که تمام کالا ها رو چه شماره قدیم دارند چه ندارند برمی گردونه
SELECT dbo.Parts_PartsReplace.OldPartNum, Parts_PartsReplace_1.NewPartNum
FROM dbo.Parts_PartsReplace RIGHT OUTER JOIN
dbo.Parts_PartsReplace AS Parts_PartsReplace_1 ON dbo.Parts_PartsReplace.NewPartNum = Parts_PartsReplace_1.OldPartNum
و ازش استفاده کردم تا کوئری بازگشتی زیر رو بنویسم اما کوئری بازگشتی هیچی بر نمگردونه؟؟!!
WITH Parts_PartsReplaceRecursive(OPartNum,PartNum,LEVEL )
AS
(
SELECT OldPartNum,NewPartNum,0 AS LEVEL FROM dbo.Parts_PartsReplaceView WHERE OldPartNum = null
UNION ALL
SELECT OldPartNum,NewPartNum,Level + 1 AS LEVEL FROM dbo.Parts_PartsReplaceView
INNER JOIN Parts_PartsReplaceRecursive AS PR ON PR.PartNum = dbo.Parts_PartsReplaceView.OldPartNum
)
SELECT OPartNum,PartNum,LEVEL FROM Parts_PartsReplaceRecursive
4 پاسخ
ممنون از پاسخاتون ولی من از لینکای زیر استفاده کردم
https://technet.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx
http://www.codeproject.com/Tips/674287/Recursive-Queries-in-Microsoft-SQL-Server
شما در قسمت سوم کدتون این عبارت رو نوشتید .
OldPartNum = null
بعید میدونم خروجی رو بهتون نمایش بده. چون شما دارید میگید اون کالاهایی رو که چه شماره ی قدیم دارند و چه ندارند. باید اینجا از منطق OR استفاده کنید یا اصلا شرطی براش لحاظ نکنید.
به همین دلیل که آقای M.T فرمودند کوری بازگشتی به ۱۰۰ مرحله می رسد (یعنی یک حلقه بی نهایت می شود) و در آخر SQL Server دستور را Terminate می کند.
فهمیدم مشکل کجاست باید از is null استفاده می کردم به جای مساوی با null