بهار آموزش با تخفیف های شگفت انگیز توسینسو بهار آموزش با تخفیف های شگفت انگیز توسینسو
مانده تا پایان تخفیف
مشاهده دوره ها
0

مشکل با کوئری بازگشتی 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
پرسیده شده در 1394/10/23 توسط

4 پاسخ

1

شما در قسمت سوم کدتون این عبارت رو نوشتید .

OldPartNum = null

بعید میدونم خروجی رو بهتون نمایش بده. چون شما دارید میگید اون کالاهایی رو که چه شماره ی قدیم دارند و چه ندارند. باید اینجا از منطق OR استفاده کنید یا اصلا شرطی براش لحاظ نکنید.

پاسخ در 1394/10/23 توسط
0

به همین دلیل که آقای M.T فرمودند کوری بازگشتی به ۱۰۰ مرحله می رسد (یعنی یک حلقه بی نهایت می شود) و در آخر SQL Server دستور را Terminate می کند.

پاسخ در 1394/10/24 توسط
1

فهمیدم مشکل کجاست باید از is null استفاده می کردم به جای مساوی با null

پاسخ در 1394/10/24 توسط

پاسخ شما