PDA

View Full Version : اعمال شرط جهت جستجوی یک رکورد خاص



afshin_zeinal
شنبه 16 دی 1391, 09:19 صبح
سلام

من یک جدول دارم که چند هزار رکورد داره و عناصر آن ord_ID , Action_cd می باشد مشکلی دارم در جستجوی یک رکورد خاص . هر چه که کردم نتوانستم مشکلم را حل کنم

می خواهم وقتی Action_cd هر ord_ID که برابر 0 شد . آن ord_ID در جستجو نمایش داده نشود
در این مثال می خواهم رکورد اول فقط نمایش داده شود


ord_ID Action_cd
5 21
6 21
6 0

mohsen24000
شنبه 16 دی 1391, 09:23 صبح
خب، شما کوئری که نوشتید رو اینجا بذارید تا مشکلتون بررسی بشه.
در هر صورت، شرط شما بایستی شبیه به این باشه: Action_cd<>0

afshin_zeinal
شنبه 16 دی 1391, 09:36 صبح
خب، شما کوئری که نوشتید رو اینجا بذارید تا مشکلتون بررسی بشه.
در هر صورت، شرط شما بایستی شبیه به این باشه: Action_cd<>0




SELECT

OrdID,Action_CD
FROM Sabeghe


Action_cd<>0 را هم امتحان کرده ام اما رکورد دوم هم نمایش می دهد

mohsen24000
شنبه 16 دی 1391, 09:44 صبح
Action_cd<>0 را هم امتحان کرده ام اما رکورد دوم هم نمایش می دهد
واضحه که نشون میده! این که اولین رکورد رو برگردونه با دستور Top 1 این کار انجام میشه. ولی بحث اینجاست که کدوم اولین رکورد!؟ اون اولین رکورد بایستی چه مشخصه ای داشته باشه!؟

afshin_zeinal
شنبه 16 دی 1391, 10:38 صبح
سلام

من یک جدول دارم که چند هزار رکورد داره و عناصر آن ord_ID , Action_cd می باشد مشکلی دارم در جستجوی یک رکورد خاص . هر چه که کردم نتوانستم مشکلم را حل کنم

می خواهم وقتی Action_cd هر ord_ID که برابر 0 شد . آن ord_ID در جستجو نمایش داده نشود
در این مثال می خواهم رکورد اول فقط نمایش داده شود


ord_ID Action_cd
5 21
6 21
6 0


سوالم را تصحیح می کنم : هر ord_ID که Action_cd آن مقادیر 21 و 0 دارد در جستجو نمایش داده نشود

mohsen24000
شنبه 16 دی 1391, 11:25 صبح
فعلا این کوئری دم دستی رو تست کن تا یه کوئری بهتر::چشمک:

select * from db_tmp where ord_id=
(select ord_id from db_tmp where action_cd=21
except
select ord_id from db_tmp where action_cd=0)


یه راه حل دم دستی دیگه::لبخندساده:

select * from db_tmp where ord_id not in
(select ord_id from db_tmp where action_cd=21
intersect
select ord_id from db_tmp where action_cd=0)


راه حل بهتر می خوایی، msalim عزیز باید دست به کد بشه!:بامزه:

محمد سلیم آبادی
شنبه 16 دی 1391, 17:47 عصر
این دیگه چیه؟ با AND مشکل حل میشه.



SELECT OrdID,Action_CD
FROM Sabeghe
WHERE Action_CD<>0 AND Action_CD<>21

احتمالا منظور این هست که OrdID هایی انتخاب بشن که Action_CD هایی آنها دارای هر دو مقدار 0 و 21 نباشند. مثلا OrdID شماره 6 دارای هر دو مقدار 0 و 21 در ستون Action_CD هست، در نتیجه نباید در خروجی ظاهر بشه.
ضمنا یعنی میخواهین بگین اون کسی که این سوال رو مطرح کرده خودش بلد نبوده این کدو بنویسه؟

WHERE Action_CD<>0 AND Action_CD<>21

محمد سلیم آبادی
شنبه 16 دی 1391, 17:58 عصر
سوالم را تصحیح می کنم : هر ord_ID که Action_cd آن مقادیر 21 و 0 دارد در جستجو نمایش داده نشود جواب سوال شما بر اساس برداشت اول(که امید وارم منظورتون این موضوع نبوده باشه!):
SELECT OrdID,Action_CD
FROM Sabeghe
WHERE action_cd NOT IN (0, 21)

جواب سوال شما بر اساس برداشت دوم:
راه حل ها از پرهزینه به کم هزینه:
روش اول کلاسیک:
SELECT * FROM T T1
WHERE NOT EXISTS
(SELECT *
FROM T T2
WHERE T1.id = T2.id
AND EXISTS
(SELECT *
FROM T T3
WHERE T3.id = T2.id
AND cd = 0)
AND EXISTS
(SELECT *
FROM T T4
WHERE T4.id = T2.id
AND cd = 21));
روش دوم با کمک عملگرهای مجموعه ای:
SELECT * FROM T
WHERE id IN
(SELECT id FROM T
EXCEPT
(SELECT id FROM T
WHERE cd = 0
INTERSECT
SELECT id FROM T
WHERE cd = 21));

روش سوم: گروه بندی:
SELECT T.* FROM T
INNER JOIN
(SELECT id
FROM T
GROUP BY id
HAVING COUNT(DISTINCT CASE WHEN cd IN (0, 21) THEN cd ELSE NULL END) < 2) AS D ON T.id = D.id;