سلام.
در این تاپیک نکاتی در مورد این دو دستور بیان خواهد شد.
جداول زیر رو ایجاد بفرمائید.
Create Table
Customers(CustId int not null,
CustomerName varchar(20),
Constraint PK_Customers primary Key(CustID)
);
Create Table Orders
(OrderId int not null,
CustId Int Null,
Price Int,
Constraint PK_Orders primary key(OrderId)
);
Insert Into Customers
Values(1,'Hamid'),
(2,'Mohammad'),
(3,'Ali'),
(4,'Reza'),
(5,'ALireza');
Insert Into Orders
Values(1,1,1000),
(2,1,5000),
(3,2,6000),
(4,Null,7000),
(5,4,8000);
ما میخواهیم لیست مشتریانی رو بدست بیاوریم که هیچ فروشی برای آنها در جدول orders ثبت نشده است.
به دو روش میتوان آنرا انجام داد.
هم با استفاده از دستور In هم با استفاده از دستور Exists.
دستور زیر را ابتدا اجرا بفرمائید.
Select * from Customers
Where CustId not in(select CustId from Orders)
ولی این دستور نتیجه ای رو به ما نمایش نخواهد داد.(دلیل آنرا بیان کنید)
در صورتی که الان کاربر با کد 3و5 هیچ فروشی برای آنها ثبت نشده است.
حال دستور زیر رو اجرا کنید.
Select * from Customers
Where Not Exists(Select * from Orders
Where Customers.custid=Orders.Custid)
مشاهده میکنید که نتیجه مورد نظر مارا نمایش داد.
هردو دستور از لحاظ منطقی و ساختاری درست هستند ولی چرا با In نتیجه دلخواه را نمایش نداد ولی با Exists نتیجه دلخواه را دریافت کردیم؟
برای اینکه بتوانیم نتیجه را با In نیز ببینیم باید چه تغییری در دستور بدهیم و چرا؟؟