PDA

View Full Version : select تو در تو با خاصیت and



mhamedm2008
پنج شنبه 14 خرداد 1394, 19:42 عصر
با سلام من از کد زیر استفاده می کنم.

(select nam, from sh_master
where
(sh_master.sh_id_master in (select sh_id_master from sh_group_shahid where sh_id_group in ( select sh_id_group from tbl_temp where id_user = @id_user)))

مشکلم اینکه که این کد میاد به ازای مقادیر جدول tbl_temp نتایج بدست آمده را به صورت or نشون میده.
فرض کنید که دو عدد 100 و 200 را در جدولtbl_temp قرار می دهم.
حال به این صورت که اگر sh_id_groupبرای علی 200 و100 و برای احمد 200 و300 و برای حسن هم 100 و400 باشه. اونوقت در این خروجی میاد اسم علی واحمد و حسن رو با هم چاپ می کنه. ولی من می خوام فقط اسم علی را چاپ کنه.( چون فقط این مقادیر در جدولtbl_temp ذخیره شده است.
امیدوارم توانسته باشم خوب مطلب و انتقال بدم
با تشکر
منتظر دوستان هستم

mhamedm2008
جمعه 15 خرداد 1394, 10:26 صبح
راه دیگه ای به جر این راه نداره؟؟ که می خوام نتایج یک جدول رو به صورت AND توی یک سلکت دیگه بیاره نه به صورت OR
با تشکر

reza_ali202000
جمعه 15 خرداد 1394, 12:34 عصر
ساختار جدولاتون رو بزارید به صورت عکس(همین سه جدول) اخه یه خورده گنگ هست.
مثلا sh_group_shahid زیر مجموعه sh_master هست یا برعکس؟
اگه شهید گروه هست پس چرا باید فیلد id_master داخلش باشه؟
لطفا از دیاگرام همین سه تا عکس بگیرید بزارید تا اگه تونستیم مشکلتون رو حل کنیم.

mhamedm2008
جمعه 15 خرداد 1394, 17:22 عصر
این کل سلک هست.بدون هیچ کاستی



SELECT sh_master.sh_id_master, sh_master.sh_nam, sh_master.sh_family, sh_master.sh_sh, sh_master.sh_pedar, sh_master.sh_sodoor,
sh_master.sh_tavalod, sh_master.sh_taahol, sh_master.sh_mazhab, sh_master.sh_exp, sh_master.sh_shahadat_date, sh_master.sh_amaliat,
sh_master.sh_ostan_shahadat, sh_master.sh_mantaghe_shahadat, sh_master.sh_semat, sh_master.sh_add, sh_master.sh_tel, sh_master.sh_mafghood,
sh_master.sh_ostan, sh_master.sh_shahr, sh_master.sh_roosta, sh_master.sh_sen, sh_master.sh_add_file, sh_mazhab.sh_nam_mazhab, Tbl_Ostan.Title,
Tbl_Shahrestan.Title AS Expr1, Tbl_Ostan_1.Title AS Expr2, sh_amaliat_nam.sh_nam_amaliat
FROM sh_master LEFT OUTER JOIN
sh_amaliat_nam ON sh_master.sh_amaliat = sh_amaliat_nam.sh_id_amaliat LEFT OUTER JOIN
Tbl_Ostan AS Tbl_Ostan_1 ON sh_master.sh_ostan_shahadat = Tbl_Ostan_1.ID LEFT OUTER JOIN
Tbl_Shahrestan ON sh_master.sh_shahr = Tbl_Shahrestan.ID LEFT OUTER JOIN
Tbl_Ostan ON sh_master.sh_ostan = Tbl_Ostan.ID LEFT OUTER JOIN
sh_mazhab ON sh_master.sh_mazhab = sh_mazhab.sh_id_mazhab
where (sh_nam LIKE '%'+ isnull(@nam,sh_nam) + '%' ) AND
(sh_family LIKE '%'+ isnull(@family,sh_family) + '%' ) AND
(sh_pedar LIKE '%'+ isnull(@pedar,sh_pedar) + '%' ) AND
(sh_exp LIKE '%'+ isnull(@exp,sh_exp) + '%' ) AND
(sh_tavalod LIKE '%'+ isnull(@tt,sh_tavalod) + '%' ) AND
(sh_shahadat_date LIKE '%'+ isnull(@ts,sh_shahadat_date) + '%' ) AND
(sh_semat LIKE '%'+ isnull(@semat,sh_semat) + '%' ) AND
(sh_add LIKE '%'+ isnull(@add,sh_add) + '%' ) AND
(sh_mantaghe_shahadat LIKE '%'+ isnull(@mantaghe,sh_mantaghe_shahadat) + '%' ) AND
(sh_mazhab = isnull(@kod_mazhab,sh_mazhab)) AND
(sh_amaliat = isnull(@kod_amaliat,sh_amaliat)) AND
(sh_ostan_shahadat = isnull(@ostan_shahadat_kod,sh_ostan_shahadat)) AND
(sh_taahol = isnull(@kod_taahol,sh_taahol)) AND
(sh_mafghood = isnull(@kod_mafghood,sh_mafghood)) AND
(sh_shahr = isnull(@shahr_kod,sh_shahr)) AND
(sh_ostan = isnull(@ostan_kod,sh_ostan)) AND
(sh_sen between @sen1 AND @sen2) AND
(sh_roosta LIKE '%'+ isnull(@roosta,sh_roosta) + '%') AND
(sh_master.sh_id_master in (select sh_id_master from sh_group_shahid where sh_id_group in ( select sh_id_group from tbl_temp where id_user = @id_user)))
ORDER BY sh_master.sh_family
offset @offset_up * @RecordPerPage rows fetch first @RecordPerPage rows only
end



خروجی select من به صورت نتایج زیر نشون میده. مشکل من اینه که می خوام هنگام جستجو مطابق شکل اول، طرف انتخاب کنه که چه شهیدی پیدا بشه. در شکل زیر انتخاب کردم که شهید را پیدا کنه که هم پاسدار باشه و هم دانشجو.
ولی این میاد شهید هایی را میاره که پاسدار باشه یا دانشجو
طریقه کار هم به این صورت هست که وقتی طرف برای جستجو میاد گروه های رو انتخاب میکنه.ID آن در تییل tbl_temp ذخیره میشه و از طریق سلکت که در آخرین دستور کد بالا قرار داره میاد جستجو میکنه.
یعنی این دستور :

(sh_master.sh_id_master in (select sh_id_master from sh_group_shahid where sh_id_group in ( select sh_id_group from tbl_temp)))

سوال من هم اینکه که چه جوری شهیدی که هم در گروه پاسدار و هم دانشجو قرار داره رو نشون بده.(یعنی شهید با sh_id_master شماره 3 که در sh_id_group شماره 500 و 510 قرار داره)امیدوارم تونسته باشم واضح بگم.
البته اینو هم بگم شاید راهم اشتباه باشه و راه راحتی هم باشه که نیاز به این همه گرفتاری نداشته باشه
شرمنده ممنون.



131967
131968
131969
131970

131971

reza_ali202000
شنبه 16 خرداد 1394, 00:38 صبح
دوست عزیز بالاخره به نتیجه رسیدم.
select * from sh_master
where id_master in(
select sh_id_master from sh_group_shahid
where sh_id_group in( select sh_id_group from tbl_temp)
group by sh_id_master
having COUNT(*)>=(select COUNT(*) from tbl_temp))

میاد اسم افرادی رو که گروهشون توی tbl_temp هس رو کامل در میاره همون and در واقع انجام میده.
عکس جداولی رو هم که درست کردم براتون میزارم.

mhamedm2008
شنبه 16 خرداد 1394, 14:45 عصر
داداش واقعا دمت گرم.
گل کاشتی