PDA

View Full Version : Select تو در تو



ras1364
پنج شنبه 23 دی 1389, 20:45 عصر
با سلام خدمت دوستان عزیزم

من سه تا جدول دارم اولی بیماری دومی نشانه های بیماری و سومی جدول رابطه بین بیماری و نشانه
من نام بیماری ای رو می خوام که مثلا سه تا نشانه داره سردرد و تب و حالت تهوع

جدول بیماری
کد نام بیماری
1 سرما خوردگی
2 التهاب
3 آلرژی


جدول نشانه ها
کد نشانه
1 سرگیجه
2 ضعف
3 تب
4 سردرد
5 حالت تهوع

جدول رابطه
کد کد بیماری کد نشانه
1 1 3
2 1 4
3 1 5
و ....
این رو چه جوری سلکت کنم

Reza_Yarahmadi
پنج شنبه 23 دی 1389, 21:16 عصر
ساده ترین حالتش میتونه بصورت زیر باشه. با چه ورژنی از SQL Server کار میکنید؟


Select
*
From
RelationTable R INNER JOIN Sick S
On
R.SickId = S.ID
INNER JOIN Symptom SY
On
R.SyId = SY.ID
Where
(Select SymptonName + ','
From
Symptom INNER JOIN RelationTable
On
R.SyId = SY.ID
For Xml Path('')) LIKE '%سردرد%حالت تهوع%تب%'

iman_Delphi
پنج شنبه 23 دی 1389, 21:21 عصر
1 - احساس ميكنم جدول سوم از نظر normalization داراي مشكل باشه و بعدا" يه مقداري اذيتتون كنه


2- اينم جوابتون


Select * From (Select نام بيماري ,(Select count(*) from جدول رابطه ها Where كد بيماري = كد بيماري and (كد نشانه = سردرد or كد نشانه = تب or كد نشانه = تهوع)) as tedadebimari from جدول بيماري ها) as SELECTINSIDE
Where tedadebimari =>3

m_omrani
جمعه 24 دی 1389, 12:03 عصر
به نظر من طراحی جداول از نظر نرمال سازی مشکلی نداره.

اما سوالی که برام پیش اومد اینه که آیا این که می گید بیماری ای رو می خواید که سه نشانه داشته باشه، مقصودتون اینه که سه نشانه ی به خصوص و دقیقاً مشخص رو داشته باشه یا هر بیماری ای رو می گید که به هر حال حداقل سه تا نشانه داشته باشه.

اگه مقصودتون سه نشانه به خصوصه، با عملگر and در قسمت where می تونید این محدودیت رو اعمال کنید.
بیماری ای که دقیقاً نشانه A «و» و نشانه B «و» و C رو داشته باشه:

select d.* from Disease d inner join Disease_Sign ds on d.DiseaseID = ds.DiseaseID inner join Sign s on ds.SignID = s.SignID
where s.Title = 'A' and s.Title = 'B' and s.Title = 'C'

اگر مقصودتون تعداد نشانه ها است با group by و having راحت می تونید به جواب برسید:


select d.Title from Disease d inner join Disease_Sign ds on d.DiseaseID = ds.DiseaseID
group by d.Title
having count(d.Title) >= 3