View Full Version : سوال: error در هنگام اجرای دستور select
baran_mehr
شنبه 21 فروردین 1389, 15:16 عصر
سلام به همه دوستان
من نمیدونم چرا وقتی به این قسمت از دستورم میره خطا میگیره؟ اما گاهی هم نمیگیره؟
WHERE ('1380/01/01' >= dbo.morekhasi.begindate) AND ('1380/01/01' <= dbo.morekhasi.enddate)
تصویر error هم گذاشتم
محمد سلیم آبادی
شنبه 21 فروردین 1389, 16:13 عصر
سلام،
امکان داره Query را کامل پست کنید. Error مربوط به یک Subquery هست (که بیش از یک مقدار رو بر میگردونه که طبعا نمیشه با عملگرهایی چون = یا ... استفاده کرده در این مواقع بایستی از عملگر هایی چون ALL= و ... بهره برد) ولی در کدی که قرار دادین من Subquery نمی بینم.
baran_mehr
شنبه 21 فروردین 1389, 22:58 عصر
سلام
اینم کد کاملش:
SELECT name
FROM dbo.Info
WHERE (code <>
(SELECT code
FROM morekhasi
WHERE ('1381/06/16' >= dbo.morekhasi.begindate) AND ('1381/06/16' <= dbo.morekhasi.enddate))) AND (type = 1)
محمد سلیم آبادی
یک شنبه 22 فروردین 1389, 00:08 صبح
همانطوری که در پست اولم اشاره کردم SELECT ای که داخل Query اتان استفاده کردین (به اصطلاح Subquery) بیش از یک مقدار رو بر میگردونه (البته گاهی اوقات) در اینصورت نمیشه با عملگرهایی که نیاز به دو عملوند دارند استفاده بشن.
من در ادامه راه حلهایی رو ارائه میدم که تنها Error مربوطه از بین بره. و واقعا نمی دونم منطق کوئریتان چیه تا براتون کامل اصلاحش کنم.
من نمی دونم از چه نسخه ای دارین استفاده می کنین اگر از 2005 به بالاتر استفاده میشه از ()ALL<> استفاده کرد.
SELECT name
FROM dbo.Info
WHERE code <> ALL (SELECT code
FROM morekhasi
WHERE ('1381/06/16' >= dbo.morekhasi.begindate)
AND ('1381/06/16' <= dbo.morekhasi.enddate))
AND (type = 1);
در غیر اینصورت:
SELECT name
FROM dbo.Info
WHERE code <> (SELECT TOP 1 code
FROM morekhasi
WHERE ('1381/06/16' >= dbo.morekhasi.begindate)
AND ('1381/06/16' <= dbo.morekhasi.enddate))
AND (type = 1);
محمد سلیم آبادی
یک شنبه 22 فروردین 1389, 02:22 صبح
شاید هم نیاز باشه <> با NOT IN تعویض کنید:
SELECT name
FROM dbo.Info
WHERE code NOT IN
(SELECT code
FROM morekhasi
WHERE ('1381/06/16' >= dbo.morekhasi.begindate)
AND ('1381/06/16' <= dbo.morekhasi.enddate))
AND (type = 1);
baran_mehr
یک شنبه 22 فروردین 1389, 10:15 صبح
ممنون دوست عزیز مشکل همین NOT IN بود وقتی با <> تعویضش کردم درست شد
محمد سلیم آبادی
یک شنبه 22 فروردین 1389, 12:12 عصر
البته از نظر منطقی روش ()ALL<> هم میتونه همین نتیجه رو برایتون تولید کنه. که دقیقه معادل ()NOT IN هست.
()SOME= هم میتونه جایگزینی برای ()IN باشه.
توجه کنید که داخل پرانتز های نوشته شده یک SELECT قرار می گیرد.
محمد سلیم آبادی
یک شنبه 22 فروردین 1389, 18:41 عصر
سعی کنید به خاطر بهبود سرعت اجرای کوئریهایتان تا جایی که امکان داره از JOIN و مشتقاتش به جای IN استفاده کنین:
این کوئری همان نتیجه رو می ده ولی با JOIN پیاده سازی شده:
SELECT name
FROM dbo.Info AS I
LEFT OUTER JOIN
morekhasi AS M
ON I.code = M.code
AND '1381/06/16' >= M.begindate
AND '1381/06/16' <= M.enddate
WHERE I.type = 1
AND M.code IS NULL;
محمد سلیم آبادی
یک شنبه 22 فروردین 1389, 21:01 عصر
کاری رو که شما سعی در انجامش دارین در واقع تفاصل داده های دو مجموعه هستش که در مقاله ی زیر به آن پرداختم، می تونید با روش های دیگه ای مثل NOT EXISTS ، OUTER APPLY و EXCEPT آشنا شوید:
http://www.30sharp.com/ShowArticle.aspx?nid=13&did=196&AuthorID=11
محمد سلیم آبادی
دوشنبه 23 فروردین 1389, 19:34 عصر
سلام msalim
از آقای تشکر می کنم واقعا نکته های خوبی در مورد کار با دیتا بیس می دن اگر میشه یه تاپیک در مورد نکات ریز افزایش سرعت Query ها ایجاد کنید تا نکات آموزشی برای تمام سطح کاربران داشته باشه
بازم ممنونم.:قهقهه:
اولین قدم برای رسیدن به یک Query بهینه این است که از نظر منطقی با زبان SQL اشنا بشین. سپس سعی کنید Query های خودتون رو با سلیقه بنویسین و حتی به ظاهر و ترتیب نوشتن ماده ها، عملگرها و نام ها دقت کنید.
بعد از این مرحله باید با پشت پرده ی SQL Server آشنا بشین. بدونید هنگامی که یک Query اجرا میشه چه اتفاق هایی می افته. و باید چه کارهایی کرد تا سرعت بهتر بشه (یعنی بحث Index Tuning و Execution Plan)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.