ورود

View Full Version : شرط Where با 2 فیلد در subQuery



hozouri
پنج شنبه 24 دی 1388, 10:21 صبح
سلام
من می خواستم شرط Where رو بر روی یک subQuery انجام بدم البته با 2 فیلد اگر میشه راهنمایی کنید.



select * from table1
where id,name not in (select id,name from table2)


ولی DBMS SQL این پیغام رو میده.


An expression of non-boolean type specified in a context where a condition is expected, near ','.

محمد سلیم آبادی
پنج شنبه 24 دی 1388, 11:07 صبح
سلام دوست عزیزم،
شما می توانید از گزاره ی EXISTS استفاده کنین که در این صورت باید از یک Correlated Subquery استفاده شود:


select *
from table1 as t1
where not exists
(select *
from table2 as t2
where t1.id = t2.id
and t1.name = t2.name)


البته با همان گزاره ی IN هم می توانین این کار را بکنین ولی به هر حال باید از Correlated Subquery استفاده شود:


select *
from table1 as t1
where id not in
(select id
from table2 as t1
where t1.name = t2.name)

بهنام بهمنی
پنج شنبه 24 دی 1388, 11:14 صبح
مي تواني در اين مواقع از join استفاده کنيد

Hamid.Kad
پنج شنبه 24 دی 1388, 11:14 صبح
یا اینکه دو تا شرط رو در کوئری اول با هم and کنید که البته روش پست شماره 2 بهتره

محمد سلیم آبادی
پنج شنبه 24 دی 1388, 11:39 صبح
من می خواستم شرط Where رو بر روی یک subQuery انجام بدم البته با 2 فیلد اگر میشه راهنمایی کنید
کاری که شما می خواهید انجام بدین عمل تفاضل (difference) است که چندین روش به غیر از not in و not exists دارد. که از جمله ی آنها بهره گیری از عملگرهای مجموعه ای و جدولی است:
union all
except
left/right outer join

hozouri
پنج شنبه 24 دی 1388, 11:40 صبح
سلام دوست عزیزم،
شما می توانید از گزاره ی EXISTS استفاده کنین که در این صورت باید از یک Correlated Subquery استفاده شود:


select *
from table1 as t1
where not exists
(select *
from table2 as t2
where t1.id = t2.id
and t1.name = t2.name)


البته با همان گزاره ی IN هم می توانین این کار را بکنین ولی به هر حال باید از Correlated Subquery استفاده شود:


select *
from table1 as t1
where id not in
(select id
from table2 as t1
where t1.name = t2.name)


دوست عزیز دستور دوم نباید جواب یده (با توجه به اینکه Alias دوم t2 باشه).

hozouri
پنج شنبه 24 دی 1388, 11:42 صبح
می توانی در این مواقع از join استفاده کنید

دوست عزیز من به این مورد آگاه هستم پس اگر می گم Where حتماً انگیزه خواصی دارم.

محمد سلیم آبادی
پنج شنبه 24 دی 1388, 11:45 صبح
دوست عزیز دستور دوم نباید جواب یده (با توجه به اینکه Alias دوم t2 باشه).

نام مستعار جدول دوم باید به t2 تغییر نام بدهد (اشتباه تایپی است)
چرا نباید جواب بدهد؟ آیا امتحان کردین؟

hozouri
پنج شنبه 24 دی 1388, 11:49 صبح
نام مستعار جدول دوم باید به t2 تغییر نام بدهد (اشتباه تایپی است)
چرا نباید جواب بدهد؟ آیا امتحان کردین؟

به خاطر اینکه مطمئن بشم امتحان کردم پیغام خطای زیر روی می دهد:


Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

محمد سلیم آبادی
پنج شنبه 24 دی 1388, 11:54 صبح
به خاطر اینکه مطمئن بشم امتحان کردم پیغام خطای زیر روی می دهد:


Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.


از اینکه در قسمت لیست ستون ها سابکوئری تنها یک ستون (در اینجا id) قرار گرفته مطمئن شوید. شما به احتمال زیاد در لیست ستون های سابکوئری از * یا کاما لیست استفاده کردین.
منظورم در این خط است:


select *
from table1 as t1
where id not in
(select id
from table2 as t2
where t1.name = t2.name)