PDA

View Full Version : برای این quary راهنماییم کنیم!!!



nimja145
دوشنبه 10 اسفند 1388, 11:45 صبح
سلام
میخواهم یک دستور sql بنویسم که مشخصات همه دانش آموزانی که معدلشون زیر 10 هست رو برگردونه.
2 تا جدول دارم : stud و score که کلید هر 2تاشون id هست.
ارتباط هم برقرار کردم
فیلد معدل avrg هست.
دستور زیر رو امتحان میکنم:


select *
from stud
where stud.id= (select id from score
where avrg<10)



ولی ارور زیر رو میده:


Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


در ضمن از sql2000 آستفاده میکنم.

ممنون میشم راهنماییم کنید که این دسته کدها رو به چه صورت باید بنویسم

ASKaffash
دوشنبه 10 اسفند 1388, 11:55 صبح
سلام


Select *
From Stud
Left Join Score On Score.ID=Stud.ID
Where Score.Avrg<10

nimja145
دوشنبه 10 اسفند 1388, 12:03 عصر
سلام


Select *
From Stud
Left Join Score On Score.ID=Stud.ID
Where Score.Avrg<10


ممونم از شما
فقط میشه در مورد Left Join Score On Score.ID=Stud.ID توضیح بدید.
و اینکه این فرم دستوراتی که من نوشتم چه اشکالی داره که باعث میشه اجرا نشه؟

ASKaffash
دوشنبه 10 اسفند 1388, 12:12 عصر
سلام
علاوه بر شرط Score باید برابری دو ID را هم قرار دهید (بیش از یک رکورد بر می گشت) در ضمن Join به راحتی اتصال دو جدول را ایجاد می کند بقیه در این جزوه :

http://barnamenevis.org/forum/showthread.php?t=106494

محمد سلیم آبادی
دوشنبه 10 اسفند 1388, 12:13 عصر
سلام


Select *
From Stud
Left Join Score On Score.ID=Stud.ID
Where Score.Avrg<10


سلام،
در صورتی که JOIN به تنهایی کافیه چرا از OUTER JOIN استفاده کردین؟

Open Poster قست دارن عمل Semi Join رو انجام بدن که باید بجای = از IN استفاده کن چون دارن از Multi value subquery استفاده می کنند.

راه حل پیشنهادی من:


SELECT *
FROM stud s
JOIN (SELECT id
FROM score
WHERE avrg<10) d(id)
ON s.id = d.id;

nimja145
دوشنبه 10 اسفند 1388, 12:30 عصر
حالا اگر بخواهیم که تمام این مشخصات رو از جدول stud پاک بکنه باید چه کار کرد؟
همین join جواب میده؟

محمد سلیم آبادی
دوشنبه 10 اسفند 1388, 12:48 عصر
DELETE FROM S
FROM stud S
JOIN (SELECT id
FROM score
WHERE avrg<10) d(id)
ON s.id = d.id;


و اگر از SQL Server 2005 و بالاتر استفاده می کنی:



SELECT S1.*
FROM stud S1
CROSS APPLY (SELECT id
FROM score S2
WHERE avrg < 10
AND S2.id = S1.id) d(id)

nimja145
دوشنبه 10 اسفند 1388, 16:25 عصر
این دستور اشکالی نداره؟


DELETE stud
WHERE stud.id IN
(SELECT id
FROM score
WHERE avrg< 10)

محمد سلیم آبادی
دوشنبه 10 اسفند 1388, 16:55 عصر
این دستور اشکالی نداره؟


DELETE FROM stud
WHERE stud.id IN
(SELECT id
FROM score
WHERE avrg< 10)


فقط یک FROM بعد از DELETE کم داره

ASKaffash
سه شنبه 11 اسفند 1388, 11:53 صبح
سلام
بهترین و سریعترین روش اینستکه روی فیلد Avrg یک ایندکس گذاشته شود و دستور اینطوری نوشته شود:


Select *
From Score
Left Join Stud On Stud.ID=Score.ID
Where Score.Avrg<10

محمد سلیم آبادی
سه شنبه 11 اسفند 1388, 12:59 عصر
سلام
بهترین و سریعترین روش اینستکه روی فیلد Avrg یک ایندکس گذاشته شود و دستور اینطوری نوشته شود:


Select Stud.*
From Score
Left Join Stud On Stud.ID=Score.ID
Where Score.Avrg<10


سلام،
قبل از همه کاربر قصد دارن تنها ستونهای جدول Stud را به نمایش در بیارن. پس هنگامی که به جای IN یا EXISTS از JOIN استفاده شده بایستی در قسمت Target صراحتا نام ستون های جدول Stud را ذکر کنیم.

عمل Outer join از نظر منطقی یک فاز اضافی داره اون اضافه کردن سطرهایی است که در شرط Join مچ نشدن.

اگر از left join تنها برای بهبود عملکرد استفاده کردین که من تفاوتی رو پس از امتحان روی داده ها آزمایشی بدست نیاوردم. البته Query Optimizer از عملگر left outer join برای اجرای کوئری اتان استفاده کرده ولی در کل هم از نظر تعداد Reads و هم Cost و هم Time تفاوتی ندارن.

خوشحال میشم روی داده های بیش از 10K نتیجه عملکرد کوئری را ارسال کنید

ASKaffash
سه شنبه 11 اسفند 1388, 14:29 عصر
سلام
در بسیاری از موارد استفاده از Join یک اجبار است چون بیش از یک ستون در Select از جدول دوم نیاز است Join براساس شرط Pointer را به جدول چپ و راست انتقال داده و تعداد ستونهای جلوی Select تنها سرباری به ترافیک شبکه و حجم داده های خوانده شده تحمیل می کند عمده کندی در فرآیند استخراج داده هاست یک تحقیق فنی در یک تیم در دوسال قبل داشتیم (هنوز منتشر نکرده ایم ) و عملکرد Join و موارد مشابه در ایندکس های کلاستری و غیر کلاستری نشان داده که هر اتصال به هر شکل تقریبا 50 % سربار ایجاد میکند و عملکرد Join در برخورد با کلیدهائی که از ایندکس کلاستری استفاده می شوند فوق العاده مناسب تر است این تحقیق در یک شرایط سنگین روی یک میلیون رکورد اطلاعاتی صورت پذیرفت و از آن زمان بیشتر Join را پیشنهاد میدهم (قبلا خیلی اعتقاد به Join نداشتم) متاسفانه بدون اجازه نمی توانم PDF تحقیق را منتشر کنم ولی یک بخش را همینطوری لو دادم البته روی یک جدول 100 میلیون رکوردی در حال بررسی روشهای افزایش سرعت می باشم. اینهم یک شکل دستکاری شده از یکی از نتایج تحقیق :(شرمنده دستکاری شده)