PDA

View Full Version : فوری++++ کوئری خاص



modern_amin
دوشنبه 24 شهریور 1393, 14:33 عصر
سلام
من کوئری زیر (توضیحات در عکس) رو میخام بگیرم ولی موندم
اول خواستم DISTINCT بگیرم براساس نام که غیرتکراری رو نشون نده و بعد بیام SUM بگیرم ولی خطا میخورم
بعد خواستم از WITH MyBigProducts استفاده کنم توش موندم و چندتا چیز دیگم به فکرم رسید که به جواب نرسیدم......

http://upload7.ir/imgs/2014-09/51798146813171318853.png

ali.shahrivarian
دوشنبه 24 شهریور 1393, 14:50 عصر
بهتره اطلاعات رو توسط group by گروه بندی کنی و بعد رو هر گروه محاسباتی رو که میخوای روی فیلدهاش انجام بدی و خروجی رو برای هر گروه تک سطر بگیری.

mohammad reza beizavi
دوشنبه 24 شهریور 1393, 15:47 عصر
درود بر شما
باید اینجور بشه:

SELECT name,SUM(bed) as BES,sum(bes) as BES, sum(bed)-sum(bes) as vaziyat FROM FN.Table1 group by Name;

modern_amin
سه شنبه 25 شهریور 1393, 12:31 عصر
ممنون از پاسختون

تو جدول من یک فیلد دیگه بنام شناسه ( ID ) هم هست
زمانی گه میخام براساس آخر به اول مرتب کنم
یا زمانیکه میخام با توجه به نام طرف شمارشو در بیارم (join) به خطا میخورم

آیا میشه از جواب کوئری دوباره کوئری نوشت؟
بدین ترتیب که با توجه به هرنام در هر سطر من سلکتی از جدول دیگه بگیرم ؟؟

ali.shahrivarian
سه شنبه 25 شهریور 1393, 12:39 عصر
آره


select * from (select * from table)

modern_amin
سه شنبه 25 شهریور 1393, 14:43 عصر
ممنون از پاسختون

بله درسته ولی اون حالت کلی هست

ینی مثلا همچین دستوری......

SELECT NAME,SEN , (select tel from Tmoshakhasat where name= & current_Row_cell [0] ) FROM TSTU

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 14:49 عصر
برای هر فیلد یه query نمیشه گرفت، اما شما می تونید کوئری رو به صورت function بنویسید و اینطور مسئله رو حل کنید:


SELECT NAME,SEN ,dbo.fnGetMoshtarakByName('ali') FROM TSTU

fnGetMoshrakByName یه تابع هست که مقدار رشته ای نام رو میگیره و در صورت موجود بودن شماره تلفن و در غیر اینصورت عدد صفر رو بر می گردونه.

ali.shahrivarian
سه شنبه 25 شهریور 1393, 14:57 عصر
select id,name,sum(bed)as bedSum,sum(bes) as besSum,sum(bed)-sum(bes) as result from sample
group by name
order by id desc


حالت کلی باید این باشه. شما برای چی آی دی رو میخوای؟ function هم خوبه اما الان اکثرا بار رو از پایگاه داده برمیدارن و میذارن رو زبونای برنامه نویسی

modern_amin
سه شنبه 25 شهریور 1393, 14:57 عصر
اتفاقا با نظر شما مخالفم علی آقا ali.shahrivarian
سرعت تو پایگاه داده فوق العادس
الان برا همین سوال من ، اگه بتونم کوئریشو بنویسم لازم نیست یک خط 1000 بار تکرار بشه





آخ که اگه بشه عالی میشه و واقعااا ممنون ازتون...

آقای mohammad reza beizavi میشه سمپلی بزارید من سردربیارم ازش؟؟

ali.shahrivarian
سه شنبه 25 شهریور 1393, 15:05 عصر
درسته که سرعت تو پایگاه داده بالاست اما ما برای مقیاس های کم مقایسه رو انجام نمیدیم. اگر به اطلاعات بالا و تراکنش های بالا نگاه کنیم میبینیم که اجرا شدن یک تابع در زبانی مثل سی شارپ میتونه بهتر از پایگاه داده جواب بده. البته این نظر من هست.

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 15:10 عصر
نمونه function:


CREATE FUNCTION [dbo].[fnGetMoshtarakByName]
(
@name nvarchar(15)
)
RETURNS nvarchar(15)
AS
BEGIN
DECLARE @tel AS NVARCHAR(15)




IF(EXISTS(SELECT tel FROM [Tmoshakhasat] WHERE [Tmoshakhasat].name=@name))
BEGIN
SET @tel = (SELECT tel FROM Tmoshakhasat WHERE Tmoshakhasat.name=@name);
END
ELSE
BEGIN
SET @tel = '0';
END
return @tel;
END

لطفا اگر جوابتون مربوز به پست خاصی هست از "پاسخ با نقل قول" استفاده کنید

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 15:20 عصر
اتفاقا با نظر شما مخالفم علی آقا ali.shahrivarian
سرعت تو پایگاه داده فوق العادس
الان برا همین سوال من ، اگه بتونم کوئریشو بنویسم لازم نیست یک خط 1000 بار تکرار بشه

باید عرض کنم که طبق آخرین مستندات مایکروسافت برای c# 4.5 و sql 2012 , 2014 سرعت اجرای کد در این برنامه ها بسیار به هم نزدیک بوده و تفاوت چندانی ندارند. با استفاده از کوئری که البته از function هم برای گرفتن result کوئری میگیره به ازای هر فیلد یک کوئری دیگه به سمت engine بانک اطلاعاتی میره.
اما مزیت استفاده از sp و function اینه که بار هر قسمت از برنامه به دوش مسئول مستقیم خودشه(یعنی بانک اطلاعاتی) و از اون مهمتر تعداد و حجم ارجاعات از برنامه به بانک اطلاعاتی کم میشه

modern_amin
سه شنبه 25 شهریور 1393, 15:22 عصر
ممنون از پاسختون بچه هااا
بنظرم این دستور اگه استفاده شه سرعت برنامه هایی که کوئری هاشون یکمقدار خاص تر هست خیلی بالا میره.....

آقای ali.shahrivarian دستوری که دادید درسته فقط زمانی که جداول رو بنده join میدم یا از یک فیلد غیرتکراری استفاده میکنم جواب غلط میده ، البته اگه رو یک جدول فقط بخاهیم کار کنیم مناسبه...

آقای mohammad reza beizavi ممنون بابت راهنمایی ، بنظرم همین باید باشه ، اونچیزی که تو ذهنه منه خیلی به این نزدیکه.... :تشویق::تشویق:

در ضمن آقای mohammad reza beizavi مشکل در سرعت نیست ،در تعداد دفعات تکراره ....
آقای ali.shahrivarian اگه بشه یک جواب رو با یک تابع در اس کیوال گرفت چرا باید چندین ارسال پارامتر توسط مثلا برنامه مثل سی شارپ به sql انجام بشه؟

ali.shahrivarian
سه شنبه 25 شهریور 1393, 15:26 عصر
باید عرض کنم که طبق آخرین مستندات مایکروسافت برای C#‎ 4.5 و sql 2012 , 2014 سرعت اجرای کد در این برنامه ها بسیار به هم نزدیک بوده و تفاوت چندانی ندارند. با استفاده از کوئری که البته از function هم برای گرفتن result کوئری میگیره به ازای هر فیلد یک کوئری دیگه به سمت engine بانک اطلاعاتی میره.
اما مزیت استفاده از sp و function اینه که بار هر قسمت از برنامه به دوش مسئول مستقیم خودشه(یعنی بانک اطلاعاتی) و از اون مهمتر تعداد و حجم ارجاعات از برنامه به بانک اطلاعاتی کم میشه

تو entity وقتی میخوایم از Sql اطلاعات رو فراخوانی کنیم یک کانکشن ساخته میشه و اطلاعات برگشت داده میشه و اگر از خصوصیاتی مثل list استفاده کنیم دیگه برای تغییر یا جستجو در اطلاعات فراخوانی شده نیازی به جستجوی دوباره در پایگاه نیست و تمام تغییرات درون خود برنامه سی شارپ انجام میشه. این یک مزیت محسوب میشه و جلوی کوئری های بی دلیل رو میگیره.

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 15:36 عصر
تو entity وقتی میخوایم از Sql اطلاعات رو فراخوانی کنیم یک کانکشن ساخته میشه و اطلاعات برگشت داده میشه و اگر از خصوصیاتی مثل list استفاده کنیم دیگه برای تغییر یا جستجو در اطلاعات فراخوانی شده نیازی به جستجوی دوباره در پایگاه نیست و تمام تغییرات درون خود برنامه سی شارپ انجام میشه. این یک مزیت محسوب میشه و جلوی کوئری های بی دلیل رو میگیره.
تویEntity framework که نه ولی توی LINQ اینکار برای این یک بار انجام میشه که معمولا تمام اطلاعات یک جدول رو cach میکنه و برای اینکه مشکلات این روش رو ببینید یک بار با نرم افزار یا سایتی که استفاده کننده زیادی داره امتحان کنید. فشار آوردن به سرور (در وب) و یا سیستم کلاینت با توجه به اینکه سرورهای قدرتمندی برای کار دیتابیس وجود داره اندکی غیر منطقی به نظر می رسه.
البته اگر داکیومنتهای microsoft در زمینه Entity farmework رو بخونید خواهید دید که تمام کوئری های درون entity ها به sp تبدیل میشن و درون خود پایگاه داده اجرا شده و نتیجه برگشت داده میشه.

ali.shahrivarian
سه شنبه 25 شهریور 1393, 15:39 عصر
آقای ali.shahrivarian اگه بشه یک جواب رو با یک تابع در اس کیوال گرفت چرا باید چندین ارسال پارامتر توسط مثلا برنامه مثل سی شارپ به sql انجام بشه؟
همونطور که گفتم میشه اطلاعات رو در یک بار فراخوانی در برنامه نگه داشت و تغییرات رو اعمال کرد و آخر سر تغییرات رو ذخیره کرد.

ali.shahrivarian
سه شنبه 25 شهریور 1393, 15:41 عصر
تویEntity framework که نه ولی توی LINQ اینکار برای این یک بار انجام میشه که معمولا تمام اطلاعات یک جدول رو cach میکنه و برای اینکه مشکلات این روش رو ببینید یک بار با نرم افزار یا سایتی که استفاده کننده زیادی داره امتحان کنید. فشار آوردن به سرور (در وب) و یا سیستم کلاینت با توجه به اینکه سرورهای قدرتمندی برای کار دیتابیس وجود داره اندکی غیر منطقی به نظر می رسه.
البته اگر داکیومنتهای microsoft در زمینه Entity farmework رو بخونید خواهید دید که تمام کوئری های درون entity ها به sp تبدیل میشن و درون خود پایگاه داده اجرا شده و نتیجه برگشت داده میشه.

توی linq خودش دیتاها رو cach میکنه اما تو entity اگر به list تبدیل نکنید برای هر بار فراخوانی entity دستورات sp اجرا میشن اما همونطور که گفتم اگر به لیست تبدیل بشن تمام تغییرات درون برنامه ای میشن و دیگه به پایگاه کاری نداریم.

ali.shahrivarian
سه شنبه 25 شهریور 1393, 15:43 عصر
البته آقا محمدرضا تو دنیای امروز که همه ی مسائل با هم مرتبط هستند شما چه کدهات رو درون پایگاه بنویسی چه درون برنامه هیچ تضمینی نیست که اطلاعاتی که یک کاربر تغییر میده براش ثابت بمونه. برای این موضوع باید روش ها و الگوریتمهای جایگزین ارائه بشه و این ایراد entity یا sql نیست.

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 15:46 عصر
اما همونطور که گفتم اگر به لیست تبدیل بشن تمام تغییرات درون برنامه ای میشن و دیگه به پایگاه کاری نداریم.
و اینکه تمام اطلاعات رو کلاینت برنامه های دسکتاپ یا سرور میزبان وب پیش خودش نگه داره و روشون کار انجام میده از نظر شما مزیته؟!!!:متفکر::متفکر:

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 15:52 عصر
تو دنیای امروز که همه ی مسائل با هم مرتبط هستند شما چه کدهات رو درون پایگاه بنویسی چه درون برنامه هیچ تضمینی نیست که اطلاعاتی که یک کاربر تغییر میده براش ثابت بمونه. برای این موضوع باید روش ها و الگوریتمهای جایگزین ارائه بشه و این ایراد entity یا sql نیست.
من کلا منظور این قسمت رو متوجه نشدم، مگه باید تضمینی برای اطلاعاتی که یک کاربر تغییر میده وجود داشته باشه و یا اطلاعات ثابت بمونه.
و یه نکته در کل تکنولوژی ها هرچند کامل نیستند اما ابزار مناسبی هستن اگه ازشون به درستی استفاده بشه چه linq و چه sql و یا هر تکنولوژی دیگه ای.

ali.shahrivarian
سه شنبه 25 شهریور 1393, 15:55 عصر
و اینکه تمام اطلاعات رو کلاینت برنامه های دسکتاپ یا سرور میزبان وب پیش خودش نگه داره و روشون کار انجام میده از نظر شما مزیته؟!!!:متفکر::متفکر:


ببخشید منظورمو درست نرسوندم.
منظورم اینه که برای یک تغییر کوچیک یا فراخونی و ارسال اطلاعات برای کلاینت نیازی نیست که تمام بار رو به دوش پایگاه داده بزاریم.
البته این میتونه مزیت باشه چون اگر به سایت هایی که الان کار می کنند نگاه کنید هر کاربر اطلاعاتش با کد کاربری خودش ذخیره میشه و اطلاعات عمومی رو مدیر سایت تغییر میده نه کاربر.
شما سایتی رو دیدید که اجازه بده تمام کاربرا تو یک لحظه یک صفحه رو تغییر بدن؟
شاید مثال درستی نباشه اما همین صفحه رو نگاه کنید! من نمیتونم اطلاعات شما رو تغییر بدم و شما هم نمیتونید اطلاعات من رو تغییر بدید!!!
این مسئله برای سیستم هایی مثل حسابداری مهمه که در هر لحظه باید با هر بخش در ارتباط باشن و اطلاعات RealTime تغییر میکنه. اینها هم نمیان هر لحظه با پایگاه کار کنن(البته سیستمای کوچیک مستثنی هستند).اطلاعات میتونه درون فایلهای xml باشه یا اینکه پایگاه پشتیبانی وجود داشته باشه که تک تک تغییرات رو با زمانشون ذخیره کنه تا مشکلی بوجود نیاد. اینها دیگه مسئله زمانبندیه.

ali.shahrivarian
سه شنبه 25 شهریور 1393, 15:56 عصر
من کلا منظور این قسمت رو متوجه نشدم، مگه باید تضمینی برای اطلاعاتی که یک کاربر تغییر میده وجود داشته باشه و یا اطلاعات ثابت بمونه.
و یه نکته در کل تکنولوژی ها هرچند کامل نیستند اما ابزار مناسبی هستن اگه ازشون به درستی استفاده بشه چه linq و چه sql و یا هر تکنولوژی دیگه ای.
منظورم اینه که ممکنه چند کاربر بر روی یک تاپل کار کنن و این موضوع مشکلاتی رو در پی داره.
بخش دوم حرفتون رو هم قبول دارم.

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 16:02 عصر
ببخشید منظورمو درست نرسوندم.
منظورم اینه که برای یک تغییر کوچیک یا فراخونی و ارسال اطلاعات برای کلاینت نیازی نیست که تمام بار رو به دوش پایگاه داده بزاریم.
البته این میتونه مزیت باشه چون اگر به سایت هایی که الان کار می کنند نگاه کنید هر کاربر اطلاعاتش با کد کاربری خودش ذخیره میشه و اطلاعات عمومی رو مدیر سایت تغییر میده نه کاربر.
شما سایتی رو دیدید که اجازه بده تمام کاربرا تو یک لحظه یک صفحه رو تغییر بدن؟
شاید مثال درستی نباشه اما همین صفحه رو نگاه کنید! من نمیتونم اطلاعات شما رو تغییر بدم و شما هم نمیتونید اطلاعات من رو تغییر بدید!!!
این مسئله برای سیستم هایی مثل حسابداری مهمه که در هر لحظه باید با هر بخش در ارتباط باشن و اطلاعات RealTime تغییر میکنه. اینها هم نمیان هر لحظه با پایگاه کار کنن(البته سیستمای کوچیک مستثنی هستند).اطلاعات میتونه درون فایلهای xml باشه یا اینکه پایگاه پشتیبانی وجود داشته باشه که تک تک تغییرات رو با زمانشون ذخیره کنه تا مشکلی بوجود نیاد. اینها دیگه مسئله زمانبندیه.
فکر می کنم شما یه سری مسائل رو که جز بدیهیات و وظایف بانک اطلاعاتی هست (ماندد جلوگیری از همزمانی با تکنیکهایی مانند Lock table و lock row)، فراموش کردید. این checking ها رو خود دیتابیس انجام میده، و نیازی به مدیریت توسط مدیر سایت و برنامه نداره.
آقا بحثمون داره به دارازا میکشه و شاید بینندگان سایت رو خسته کنه. من از چت روم یا امکانات دیگه ای که برای بحث دونفره توی سایت باشه خبر ندارم. اگر میدونید چیزی بگید تا اونجا به بحثمون ادامه بدیم

ali.shahrivarian
سه شنبه 25 شهریور 1393, 16:13 عصر
فکر می کنم شما یه سری مسائل رو که جز بدیهیات و وظایف بانک اطلاعاتی هست (ماندد جلوگیری از همزمانی با تکنیکهایی مانند Lock table و lock row)، فراموش کردید. این checking ها رو خود دیتابیس انجام میده، و نیازی به مدیریت توسط مدیر سایت و برنامه نداره.
آقا بحثمون داره به دارازا میکشه و شاید بینندگان سایت رو خسته کنه. من از چت روم یا امکانات دیگه ای که برای بحث دونفره توی سایت باشه خبر ندارم. اگر میدونید چیزی بگید تا اونجا به بحثمون ادامه بدیم
:قهقهه: راست میگی. بینندگان گرامی از شما پوزش میطلبیم.
من تو یاهو تو زمان کاریم آنلاینم.

modern_amin
سه شنبه 25 شهریور 1393, 16:36 عصر
داشتین استفاده میکردیم....

من فقط دوتا سوال داشتم نخاستم بپرم وسط حرفتون...

---با کمک شما کوئری رو نوشتم همونیه که میخاستم
فقط بعد اجرا و نمایش سطرهای اولی بعد یک ثانیه خطا میده که نمیتونه رشته رو تبدیل به عدد کنه....
یکمقدار روش کار کردم ولی همچنان این خطای ریز رو میده


--- تو اس کیوال 2008 آر2
باید روی -scalar valued function ساخت؟ درسته؟
یا توی inline table و یا multi statement ؟؟
یا روی

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 21:37 عصر
فقط بعد اجرا و نمایش سطرهای اولی بعد یک ثانیه خطا میده که نمیتونه رشته رو تبدیل به عدد کنه....
یکمقدار روش کار کردم ولی همچنان این خطای ریز رو میده


--- تو اس کیوال 2008 آر2
باید روی -scalar valued function ساخت؟ درسته؟
یا توی inline table و یا multi statement ؟؟
یا روی
Scalar Valued function درسته، اما اونکه error میده به خاطر کوئری که داخل function انجام میدید، مثلا اینکه یه رشته مثل '2_' رو بخواید به عدد تبدیل کنید.
اگه جزییات بیشتری بدید بهتر میشه نظر داد.