ورود

View Full Version : سوال: گرفتن كوئري از تمام جداول و حذف ركورد هاي اضافه



ali_ahr7
چهارشنبه 08 اردیبهشت 1389, 13:04 عصر
دوستان سلام.
فرض كنيد من يك جدول اصلي با نام main و 4 زير جدول دارم
كه توي اين 4 زير جدول به ازاي هر كليد اصلي در جدول main چندين ركورد وجود داره.
حالا فرض كنيد من 4 تا ركورد در جدول اصلي وارد كردم.
ولي وقي كه ميخوام از تمام جداولم كوئري بگيرم تعداد ركورد هاي نمايش داده شده در نتيجه كوئري بجاي اينكه 4 تا باشه مثلا 40 تاست.
يعني به ازاي هر fk در جداول زير مجموعه يك ركورد برگردانده ميشه.
چطور ميشه از اين امر جلوگيري كزد؟
يعني نتيجه كوئري فقط 4 تا رديف باشه.متشكرم.

Rejnev
چهارشنبه 08 اردیبهشت 1389, 13:29 عصر
سلام
در دستور شرط، کلید جدول اصلی رو برابر کلید خارجی جداول فرعی قرار بدید:



select
main.Code,main.family,
child1.family,
child2.family,...
from
main, child1,child2,...
where
main.code=child1.foreignKField and
main.code=child2.foreignKFiled and ...

ali_ahr7
چهارشنبه 08 اردیبهشت 1389, 14:22 عصر
دوست عزيز.اولا متشكرم از توجهتون.دوما عملي نشد.

Rejnev
چهارشنبه 08 اردیبهشت 1389, 14:29 عصر
یک شکل از جدول اصلی و فرزندان و یک شکل از کوئری که مد نظرت هست و میخوای شکل اون در بیاد رو بذار و کدی که الآن استفاده میکنی رو بذار تا یک راه حل پیدا کنیم.

ali_ahr7
چهارشنبه 08 اردیبهشت 1389, 15:20 عصر
متشكرم.شما دو جدول زير رو در نظر بگيريد:


جدول اصلي
------------
idmain
name
lname







[/quote]
جدول دروس پاس شده
------------------------
id-name
doroos

[/quote]




خروجي مورد نظر: يعني 3 درس در يك رديف نشون داده بشه:

علي حسيني --> درس1,درس2,درس3
زهره طاهري-->> درس3ودرس5,درس4


متشكرم ازتون بخاطر وقتي كه صرف ميكنين.

محمد سلیم آبادی
چهارشنبه 08 اردیبهشت 1389, 15:38 عصر
خروجي مورد نظر: يعني 3 درس در يك رديف نشون داده بشه:

علي حسيني --> درس1,درس2,درس3
زهره طاهري-->> درس3ودرس5,درس4

شما قصد الحاق سطرهای جدول را دارین.
می تونید از تابع استفاده کنید و هم ماده ی FOR XML PATH در صورت استفاده از 2005.



SELECT name, (SELECT doroos +', '
FROM table_doroos
WHERE id_name = t.id_name
FOR XMP PATH('')) AS list_dorros
FROM main_table T

محمد سلیم آبادی
چهارشنبه 08 اردیبهشت 1389, 15:48 عصر
همچنین به جای correlated scalar subquey می تونید از APPLY استفاده کنید:


SELECT T.*, D.i AS list
FROM main T
CROSS APPLY (SELECT doroos +', '
FROM doroos
WHERE id_name = id_name
FOR XML PATH(''))D(i)


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

ali_ahr7
چهارشنبه 08 اردیبهشت 1389, 15:51 عصر
دوست عزيز متاسفانه من از sqlserver 2000 استفاده ميكنم.شما چه راهي رو پيشنهاد ميكنيد.راستي من اين كار رو در يك جدول در پايگاه داده northwind با كوئري زير انجام ميدم ولي نميدونم چطور اونو join كنم.لطفا اگه اطلاعاتي در اين مورد دارين به من هم بگين.متشكرم.



SELECT CategoryId,
MAX( CASE seq WHEN 1 THEN ProductName ELSE '' END ) + ', ' +
MAX( CASE seq WHEN 2 THEN ProductName ELSE '' END ) + ', ' +
MAX( CASE seq WHEN 3 THEN ProductName ELSE '' END ) + ', ' +
MAX( CASE seq WHEN 4 THEN ProductName ELSE '' END )
FROM ( SELECT p1.CategoryId, p1.ProductName,
( SELECT COUNT(*)
FROM Northwind.dbo.Products p2
WHERE p2.CategoryId = p1.CategoryId
AND p2.ProductName <= p1.ProductName )
FROM Northwind.dbo.Products p1 ) D ( CategoryId, ProductName, seq )
GROUP BY CategoryId ;

محمد سلیم آبادی
چهارشنبه 08 اردیبهشت 1389, 15:56 عصر
از اطلاعات این تاپیک استفاده کنید:
http://barnamenevis.org/forum/showthread.php?t=210343&highlight=XML

ali_ahr7
چهارشنبه 08 اردیبهشت 1389, 18:15 عصر
متشكرم.لطفا درباره كوئري زير توضيح بديد.و آيا راهي نيست كه من از كوئري كه شما در همين تاپيك مطرح كردين استفاده كنم؟


Create Function fnStudentLessons (@StudentId int)
Returns VARCHAR(8000)
AS
Begin
Declare @Lessson varchar(8000)

Select @Lessson =COALESCE(@Lessson + ',', '') + LessonName
From tblStudentLesson SL
JOIN tblLesson L ON SL.LessonID = L.LessonID
Where SL.StudentId = @StudentId

Return @Lessson
End

Select S.StudentId, S.FirstName, S.LastName , dbo.fnStudentLessons(S.StudentId) AS Lessons
From tblStudentLesson SL
JOIN tblStudent S ON SL.StudentId = S.StudentId
JOIN tblLesson L ON SL.LessonID = L.LessonID
GROUP BY S.StudentId, S.FirstName, S.LastName

محمد سلیم آبادی
چهارشنبه 08 اردیبهشت 1389, 18:20 عصر
متشكرم.لطفا درباره كوئري زير توضيح بديد.و آيا راهي نيست كه من از كوئري كه شما در همين تاپيك مطرح كردين استفاده كنم؟
کوئری که در این تاپیک قرار دادم با نسخه ی 2000 سازگاری نداره، در نتیجه قابل استفاده نیست.

این کوئری در پست قبلی ارسال کردین دقیقا اون چیزیست که دنبالشین.
تابعی هم که استفاده شده خیلی موثر هست.
شما وقتی چندتا جدول را باهمدیگر اتصال (join) می دهین بایستی بعدش گروه بندی کنید تا سطرها به تعداد سطرهای همان جدول main که نام بدین بشود.

ali_ahr7
جمعه 10 اردیبهشت 1389, 17:51 عصر
جناب msalim من هرچي سعي كردم نتونستم از كوئري پست شماره 10 استفاده كنم.لطفا اگه امكانش رو داشتين اونو بصورت فرمول بزارين.خيلي متشكرم مثل:


select object1,object2 from tb1,...

محمد سلیم آبادی
جمعه 10 اردیبهشت 1389, 20:35 عصر
چرا سعی نمی کنید یک نمونه از داده های جداولتان و یک نمونه از نتیجه ی دلخواهتنان را به شکل تصویر، شبیه به کاربری که تاپیکش در پست شماره 9 همین تاپیک قرار دارد برای ما ارسال کنید؟