PDA

View Full Version : آیا استفاده از دستور select در زبان پرس و جو sql برای انتخاب یک رکورد در یک view محدودیت خاصی دارد؟



delphi3285
یک شنبه 23 بهمن 1390, 10:05 صبح
سه جدول ایجاد کرده ام
اولی جدول درس با فیلد های واحد ، نام درس و کد درس
دومی جدول دانشجو با فیلد های نام ، نام خانوادگی و شماره دانشجویی
سومی جدول ارتباط این دو جدول با فیلد های کد درس و شماره دانشجویی
(ارتباط چند به چند دو جدول)
یک view به شکل زیر نیز ایجاد کرده ام


82505

حال می خواهم با یک جستجو بوسیله دستور select با وارد کردن شماره دانشجو لیست دوروس اخذ شده توسط وی به نمایش در آید.بنابر این کد های زیر را برای این منظور نوشته ام:

procedure TForm1.Button2Click(Sender: TObject);
begin
adoquery1.SQL.Clear;
adoquery1.SQL.Add ('select dars,vahed from view2 where std_no=:a group by dars');
adoquery1.Parameters.ParamValues['a']:=edit3.Text;
adoquery1.ExecSQL;
ADOQuery1.Active:=true;
end;

اما پیغام خطای غیر منتظره زیر ظاهر می شود:
82506
علت این اتفاق چیست؟
نحوه رفع این خطا چگونه است؟:متفکر:

tiphooo
یک شنبه 23 بهمن 1390, 14:54 عصر
شما Group By را بر اساس چی زدید دستور Group By معمولا در نتیجه یک SUM ,COUNT,MAX,Min می باشد GROUP By رو حذف کن مشکلت حل می شود.

delphi3285
چهارشنبه 26 بهمن 1390, 12:03 عصر
ممنون از جوابتون اما...
مشکل جای دیگه است.دوست عزیز من می خوام بر اساس فیلد نام درس گروه بندی انجام بدم چرا باید این دستور رو با میانگین یا مجموع یک فیلد به کار برد؟
احتمالا من دارم اشتباه می کنم در این صورت لطفا راهنمایی کنید با توجه به جدول فوق چطور می تونم با جستجوی نام یا شماره دانشجویی فردی خاص ،دروس و تعداد واحد اخذ شده توسط آن فرد را مشاهده نمایم در صورتی که نام هر درس تنها فقط یکبار در دی بی گرید به نمایش در آید.

tiphooo
چهارشنبه 26 بهمن 1390, 19:16 عصر
دستوری که شما نوشتید با برداشتن Group BY همان کاری را انجام می دهد که می خواهید ولی ظاهرا اصلا تست نکردید شما یک شماره دانشجویی را وارد کرده و می خواهید لیست دروس و تعداد واحد را نمایش دهد این نیازی به Group ندارد چون اولا هر دانشجو یک بار یک درس را می گیرد (اگر آن درس را برای بار دوم انتخاب تکرده باشد) و اینکه تعداد واحد هر درس ثابت می باشد
به جای این دو خط دستور هم adoquery1.ExecSQL;
ADOQuery1.Active:=true;
این را بنویس
AdoQuery1.Open;

BORHAN TEC
پنج شنبه 27 بهمن 1390, 00:50 صبح
شما به درستی دستور Group by رو بکار نمی برید. شما به جز aggregation function ها باید تمام مقادیر جلوی select رو جلوی عبارت group by بکار ببرید. مثل این:

SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate