PDA

View Full Version : سوال: فرزند و نزدیکترین والد دارای شرط



clever student
پنج شنبه 02 اردیبهشت 1389, 14:07 عصر
سلام ،وقتتون بخیر
با ساختار درختی دارم که table
a
/ \
b e
|
c
/
d
/ \
f g
بطور مثالc,a دارای شرط ارجاع هستن
بطور مثال اگر fخواست ارجاع بده به cو اگر ث خواست ارجاع بده به a بره.
واضحتر بگم :
IDفیلد فرزند را داریم میخواهیم IDنزدیکترین والد را که دارای شرط ارجاع است را پیدا کنیم و اینکه نمیدونیم بین والد و فرزندی که نزدیکترین والد دارای شرط ارجاع است فاصله وجوددارد

شرط ارجاع این است که: IDرکوردی که دارای شرط ارجاع است در یک table دیگه آمده باشه
لطفا راهنماییم کنید میخوام در قالبstoreproduce باشه
موفق و مویید باشید

محمد سلیم آبادی
جمعه 03 اردیبهشت 1389, 11:49 صبح
چند چیز رو اصلاح کنید تا بشه جواب داد:

1. گراف/درخت ای که رسم کردین خوانایی نداره، لطفا داخل تگ code قرار بدین تا alignment یا چیدمانش بهم نریزه.

2. باید در توضیحاتتون اشتباهی صورت گرفته باشه. مثلا گره ی f فرزند مستقیم گره ی c نیست.

3.

بطور مثال اگر fخواست ارجاع بده به cو اگر ث خواست ارجاع بده به a بره.

باید این "ث" حرف e باشد. فراموش کردین که زبان سیستم را عوض کنید.

4. ساختار جدولتون را بایستی پست کنید.

5. برای درک هرچه سریعتر و دقیق تر مشکلات بهتر است یک نمونه از داده ها و یک نمونه از نتیجه ی مورد نظر پست کنید.

clever student
یک شنبه 05 اردیبهشت 1389, 09:04 صبح
سلام ،وقتتون بخیر
با ساختار درختی دارم که table1


* 1
/ \
2 3
|
4*
\
5
/ \
7 6


tabe1


parentID , ID
1
1 2
1 3
2 4
4 5
5 6
5 7

دوتا سوال داشتم:
سوال اولم :
میخوام اگه یکی از نودهای پایانی داشته باشم به نود شروع برسم و در این فاصله ی رسیدن به نود شروع به ترتیب نودها را بدهد و در قالب یک storeproduct باشد
به طور مثال اگر به عنوان ورودی من 7 را وارد storeproduct بکنم خروجی به من رشته ی 12457 را بدهد.
سوال دوم :
اگر یک tableدیگه داشته باشم که تعدادی از نودهای table قبل را شامل میشود به نام table2
که این نودها را در ساختار درختی با کاراکتر * مشخص کرده ام.


ID table1_ID
1 1
2 4

هر نودی از table 1 خواست ارجاعی بفرستد به نزدیکترین نودی میرسد که در table 2 وجوداشته باشد
بطور مثال اگر ورودی 7 باشد خروجی 4 را بدهد و اگر ورودی 2 باشد خروجی 1 را بدهد.

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 09:51 صبح
از چه نسخه ای استفاده می کنین؟ 2005 و بالاتر؟

clever student
یک شنبه 05 اردیبهشت 1389, 11:00 صبح
از چه نسخه ای استفاده می کنین؟ 2005 و بالاتر؟
ازنسخه ی 2005

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 11:26 صبح
این جواب سوال اول هست:

سوال اولم :
میخوام اگه یکی از نودهای پایانی داشته باشم به نود شروع برسم و در این فاصله ی رسیدن به نود شروع به ترتیب نودها را بدهد و در قالب یک storeproduct باشد
به طور مثال اگر به عنوان ورودی من 7 را وارد storeproduct بکنم خروجی به من رشته ی 12457 را بدهد.



CREATE PROC tree (@nodeID INT) AS
BEGIN
;WITH cte AS
(SELECT node, parent
FROM table_name
WHERE node = @nodeID
UNION ALL
SELECT t.node, t.parent
FROM cte
JOIN table_name t
ON t.node = cte.parent)
SELECT node + ''
FROM cte
FOR XML PATH('')
END

clever student
یک شنبه 05 اردیبهشت 1389, 12:00 عصر
این جواب سوال اول هست:



CREATE PROC tree (@nodeID INT) AS
BEGIN
;WITH cte AS
(SELECT node, parent
FROM table_name
WHERE node = @nodeID
UNION ALL
SELECT t.node, t.parent
FROM cte
JOIN table_name t
ON t.node = cte.parent)
SELECT node + ''
FROM cte
FOR XML PATH('')
END

برنامه اش را نوشتم ولی error
منظورتون از cte چی بوده
و اگه لطف کنید سوال دوم هم جواب بدید ممنون میشم.

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 12:15 عصر
پیغام خطا را ارسال کنید.
اون CTE یک نام برای عبارت جدولی هست. شما نیازی به تغییر آن ندارین. فقط نام جدول و ستونهایتون را با نام هایی که در کد قرار دادم تعویض کنید.
جواب سوال دوم هم خواهم داد.

clever student
یک شنبه 05 اردیبهشت 1389, 12:24 عصر
پیغام خطا را ارسال کنید.
اون CTE یک نام برای عبارت جدولی هست. شما نیازی به تغییر آن ندارین. فقط نام جدول و ستونهایتون را با نام هایی که در کد قرار دادم تعویض کنید.
جواب سوال دوم هم خواهم داد.
این تغییراتی است که من روی Query انجام دادم


CREATEPROC tblUsrPost (@UP_ID INT)AS
BEGIN
;WITH cte AS
(SELECT UP_ID, UP_UsrPostIDParent
FROM tblUsrPost
WHERE UP_ID = @UP_ID
UNIONALL
SELECT t.UP_ID, t.UsrPostIDParent
FROM cte
JOIN tblUsrPost t
ON t. UP_ID = cte.UP_UsrPostIDParent)
SELECT UsrPostIDParent +' '
FROM cte
FORXMLPATH(' ')
END

متن error


Msg 207, Level 16, State 1, Procedure tblUsrPost, Line 8
Invalid column name 'UsrPostIDParent'.

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 12:31 عصر
به اون خطی که در پستتون bold و رنگی کردم توجه کنید.
اون نام ستون بایستی به این نام تغییر کنه: UP_UsrPostIDParent

clever student
یک شنبه 05 اردیبهشت 1389, 12:45 عصر
مرسی اون مشکل حل شد
منظورش از این error چیه ؟


Msg 2714, Level 16, State 3, Procedure tblUsrPost, Line 3
There is already an object named 'tblUsrPost' in the database.

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 12:45 عصر
جواب سوال دوم:


CREATE PROC tree_2 (@nodeID INT) AS
BEGIN
;WITH cte AS
(SELECT node, parent, 1 as level
FROM table_name
WHERE node = @nodeID
UNION ALL
SELECT t.node, t.parent, cte.level+1 as level
FROM cte
JOIN table_name t
ON t.node = cte.parent)
SELECT TOP 1 cte.node
FROM cte
INNER JOIN table2 t2
ON cte.node = t2.table1ID
ORDER BY level ASC
END


این بار دقت داشته باشین نام های ستونهایتان را صحیح وارد کنید.

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 12:49 عصر
مرسی اون مشکل حل شد
منظورش از این error چیه ؟


Msg 2714, Level 16, State 3, Procedure tblUsrPost, Line 3
There is already an object named 'tblUsrPost' in the database.


قبلا همچین SP در بانکتون ایجاد کردین. کلید واژه ی CREATE را به ALTER تغییر بدین و دوباره اجرا کنید. یا اینکه یک نام دیگر به SP بدین.

clever student
یک شنبه 05 اردیبهشت 1389, 12:50 عصر
برای این که 1store بنویسم sqlserver newquery را میزنم
حالا که میخوام از store تستی اجرایی بگیرم باید توی یک store دیگه
execute from
.........که مقدار اولیه بدم
اگه میشه روش execute هم بگید؟

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 12:58 عصر
برای این که 1store بنویسم sqlserver newquery را میزنم
حالا که میخوام از store تستی اجرایی بگیرم باید توی یک store دیگه
executefrom
.........که مقدار اولیه بدم
اگه میشه روش execute هم بگید؟

گویا دارین با express کار می کنین. متاسفانه من با اون آشنایی ندارم.

clever student
یک شنبه 05 اردیبهشت 1389, 13:15 عصر
گویا دارین با express کار می کنین. متاسفانه من با اون آشنایی ندارم.
نه خیر باDeveloper کار میکنم منظورتون از express چیه؟
منظور من ازexecute است که توی یک store دیگه store هم را فراخوانی کنم و مقدار دهی اولیه کنم؟چون الان فقط خروجی به من

Command(s) completed successfully.
را میدهد.

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 13:22 عصر
Express نسخه ی فشرده ی SQL Server هست که داخل VS استفاده می شه.
حالا منظورتون را متوجه شدم.

عبارت EXEC به این شکل هست:
EXECUTE SP_name @par1 = value1, @par2 = value2

clever student
یک شنبه 05 اردیبهشت 1389, 13:40 عصر
Express نسخه ی فشرده ی SQL Server هست که داخل VS استفاده می شه.
حالا منظورتون را متوجه شدم.

عبارت EXEC به این شکل هست:
EXECUTE SP_name @par1 = value1, @par2 = value2
لطف کنید بگید چرا این error میده؟ این کد نباید fromداشته باشه ؟


Msg 6850, Level 16, State 1, Procedure Post, Line 4
Row name ' ' contains an invalid XML identifier as required by FOR XML; ' '(0x0020) is the first character at fault.

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 13:43 عصر
چه کدی را اجرا کردین که این پیغام داده شده است؟ لطفا کدی که اجرا کردین/می کنین را پست کنید تا بررسی کنم.

clever student
یک شنبه 05 اردیبهشت 1389, 13:50 عصر
چه کدی را اجرا کردین که این پیغام داده شده است؟ لطفا کدی که اجرا کردین/می کنین را پست کنید تا بررسی کنم.


EXECUTE spPost @UP_ID=69

clever student
یک شنبه 05 اردیبهشت 1389, 14:43 عصر
(SELECT node, parent
FROM table_name
WHERE node = @nodeID
UNION ALL
SELECT t.node, t.parent
FROM cte
JOIN table_name t
ON t.node = cte.parent)
SELECT node + ''
FROM cte
FOR XML PATH('')
END

روال این query خیلی خوبه فقط اگر اینجا یک فیلدسومی از نوع nvarchar50 که عنوان فیلد هایمان است داشته باشیم و رشته ی خروجی که تولید میشه میخواهم همین خروجی فعلی باشه منتها موقع نمایش فیلد سوم که عنوانهایمان باشد را نمایش دهد.
مرسی

محمد سلیم آبادی
یک شنبه 05 اردیبهشت 1389, 15:13 عصر
من کامل متوجه نشدم.
منظورتون این است که عنوان گره هم همراه با نام گره نمایش داده بشه؟
می تونید در کد پست قبلی که رنگی کردم نام فیلد مورد نظرتون را اضافه کنید و در SELECT آخر این اصلاح رو انجام بدین:


SELECT node +' '+ caption + ''
FROM cte
FOR XML PATH('')
END


فقط توجه داشته باشین که اگر ستون Node از نوع عددی هست تبدیل به رشته ای کنید با تابع CAST.

clever student
دوشنبه 06 اردیبهشت 1389, 10:10 صبح
ALTER PROCEDURE [dbo].[spPost] (@UP_ID smallint) AS
BEGIN
;WITH cte AS
(SELECT UP_ID, UP_UsrPostIDParent
FROM tblUsrPost
WHERE UP_ID = @UP_ID
UNION ALL
SELECT t.UP_ID , t.UP_UsrPostIDParent,t.UP_Title
FROM cte
JOIN tblUsrPost t
ON t. UP_ID = cte.UP_UsrPostIDParent)
SELECT CAST(UP_ID) + ' '+UP_Title+' '
FROM cte
FOR XML PATH('')
END

سلام
به فیلد جدیدی که اضافه کرده ام و به تابع error ،CAST میگیره ؟
فیلد جدیدم به نام UP_Titleاست

محمد سلیم آبادی
دوشنبه 06 اردیبهشت 1389, 10:20 صبح
SELECT CAST(UP_ID as varchar(4))+' '+UP_Title+' '

clever student
دوشنبه 06 اردیبهشت 1389, 10:24 صبح
مرسی اون کد را هم اضافه کردم ولی این error را میدهد


Msg 205, Level 16, State 1, Procedure spPost, Line 6
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

محمد سلیم آبادی
دوشنبه 06 اردیبهشت 1389, 10:51 صبح
توجه نکردین. به پست شماره 21 دوباره دقت کنید (خطهای رنگی). بایستی این UP_title هم به SELECT اولی اضافه کنید.