PDA

View Full Version : استفاده از نام ستون مجازی در شرط Query



علیرضا حسن زاده
چهارشنبه 28 اردیبهشت 1390, 19:03 عصر
سلام
اگر یک Query به صورت زیر باشه:

Select Id,Name,Age,
(Select Jobid From EmpJob Where empjobid=id) as jobid,
(Select JobName From EmpJob Where empjobid=id) as jobName
From emp
حالا اگه بخوام یه شرط بزارم که مثلا jobid های بزرگتر از 5 رو نشون بده خطا میده (فکر کنم به این علت باشه که jobid واقعا نام یک ستون نیست) چطوری می تونم این شرط رو هم اعمال کنم چون ممکنه بعضی وقت ها این jobid مقدارش null باشه
(این یه حال فرضی از جدول ها هست به حر حال نتونستم با join مشکل رو حل کنم)

یوسف زالی
چهارشنبه 28 اردیبهشت 1390, 19:20 عصر
join یهتره



Select Id,Name,Age,
Jobid, JobName
From emp left join EmpJob on empjobid=id
where isnull(Jobid, 0)> 5

علیرضا حسن زاده
چهارشنبه 28 اردیبهشت 1390, 19:26 عصر
join رو میدونم بهتره ولی این مورد برای مورد تاپیک قبلی (به این روش حل شد) ولی تو اون شرایط join جواب نمیده
JobName و Jobid هر کدوم رو شما تو یه سطر از جدول EmpJob فرض کن

یوسف زالی
چهارشنبه 28 اردیبهشت 1390, 19:37 عصر
اون وقت میشه:

where isnull((Select Jobid From EmpJob Where empjobid=id), 0) > 5

به شرطی که داده بیشتر از یک ردیف نیاره. وگرنه ارور <=> می گیرید.

علیرضا حسن زاده
چهارشنبه 28 اردیبهشت 1390, 19:43 عصر
ردیف بیشتر از یکی نمیاره چون یه فیلد دیگه هم تو پروژه بهش اضافه می کنم که یا NULL برمیگردونه یا یه مقدار
ولی روش که شما می گی یه اشکال داره :برای Where هم باید Select جدا انجام بشه

یوسف زالی
چهارشنبه 28 اردیبهشت 1390, 19:53 عصر
این اشکالی نداره که تو where یه select باشه.
شما اگه فقط یه ردیف داری join کن.


Select Id,Name,Age,
Jobid,
(Select JobName From EmpJob B Where empjobid=B.id)as jobName
From emp
join EmpJob A on empjobid=A.id
where A.Jobid > 5


ولی به نظر میاد که هر دو subselect شما مربوط به یه ردیف باشه.
راه دیگه اینه که بریزی تو یه temp table بعد select کنی.



Select Id,Name,Age,
(Select Jobid From EmpJob Where empjobid=id)as jobid,
(Select JobName From EmpJob Where empjobid=id)as jobName
into #T
From emp
select*
from #T
where jobid > 5
drop table #T

علیرضا حسن زاده
چهارشنبه 28 اردیبهشت 1390, 20:03 عصر
اگه کل Query رو دوباره Select کنی نیازی به Temp Table نیست و شرط رو هم میشه انجام داد
من می خوام حد اکثر کارایی رو داشته باشه البته اگه راه دیگه باشه

یوسف زالی
چهارشنبه 28 اردیبهشت 1390, 20:12 عصر
متاسفانه من راه دیگه ای سراغ ندارم.
1- subselect in where
2- join
3- temp table

اما اینم تست کن:


Select Id,Name,Age,
(Select Jobid From EmpJob Where empjobid=id and Jobid > 4) as jobid,
(Select JobName From EmpJob Where empjobid=id) as jobName
From emp