PDA

View Full Version : عملگر Exist



Sh_Asgharian
سه شنبه 02 آذر 1389, 16:50 عصر
دو تا سوال راجع به عملگر Exist دارم.ممنون میشم راهنماییم کنید.
یکی مقایسه عملگر Exist-Join-Contain-in از لحاظ کارایی و سرعت و استفاده از حافظه ؟
و یکی هم سوال زیر
آیا در عملگر Exist برای مثال کد زیر به سطری از dependent برسیم که همنام employee مورد نظر باشد، این رویه را دوباره ادامه می دهیم.یعنی برای بقیه dependent ها باز چک می کنیم؟

select E.fname
from Employee As E
where Exists
(select * from dependent where E.ssn=Essn and E.fnam=Dependent_name )

zizi_zizi69
سه شنبه 02 آذر 1389, 19:20 عصر
سلام،
در مورد سوال اول باید بگم اینا،یعنی exist ,contain, in, join چه وجه مشترکی باهم دارند که بخواهیم مقایسشون کنیم.راستی دستور contain چیه؟
سوال دوم تا اونجا که من دیدم exist را با دستور if بکار می برند که اگر وجود داشت فلان کار رو بکن اگر نه فلان کار.مقدار بازگشتی دستور exist ، یک boolean بر می گردونه (true ,false )
پس دستوراتی که نوشتید معنی پیدا نمی کنه!
می تونی بدون Exist بنویسی تا درست شه یا می تونی از In استفاده کنی
برای مثال


Select *
From EmployeeAddressTable
Where FirstName IN ('Mary', 'Sam')



SELECT *
FROM EmployeeAddressTable
WHERE FirstName = 'Mary'
OR FirstName = 'Sam'

http://www.w3schools.com/sql/

Reza_Yarahmadi
چهارشنبه 03 آذر 1389, 08:14 صبح
یکی مقایسه عملگر Exist-Join-Contain-in از لحاظ کارایی و سرعت و استفاده از حافظه ؟اين دستورات چندان وجه اشتراكي ندارند.
Exists داراي خروجي بودن فرضا يك دستور رو معلوم ميكنه.
join دستور رابطه اي براي ارتباط 2 جدول با هم.
Contains معلوم كننده اينكه يك مقدار درون يك فيلد (يا يك مقدار ديگه) هست يا نه.
in يك فيلد‌ (يا مقدار) رو توي يك مجموعه جسجتو ميكنه.

آیا در عملگر Exist برای مثال کد زیر به سطری از dependent برسیم که همنام employee مورد نظر باشد، این رویه را دوباره ادامه می دهیم.یعنی برای بقیه dependent ها باز چک می کنیم؟

select E.fname
from Employee As E
where Exists
(select * from dependent where E.ssn=Essn and E.fnam=Dependent_name )بله ، براي هر سطر جستجو رو انجام ميده.
بعضي مواقع ميشه به جاي استفاده از اين روش با استفاده از يك Join به نتيجه مورد نظر رسيد. براي مثال ممكنه بشه دستور شما رو بصورت زير نوشت
Select
E.fname
From
Employee E inner join dependent D
on
E.ssn = D.Essn
AND
E.fname = D.Dependent_name

سوال دوم تا اونجا که من دیدم exist را با دستور if بکار می برند که اگر وجود داشت فلان کار رو بکن اگر نه فلان کار.مقدار بازگشتی دستور exist ، یک boolean بر می گردونه (true ,false )
پس دستوراتی که نوشتید معنی پیدا نمی کنه!همونطور كه خودتون گفتيد خروجي اين دستور Boolean است پس ميشه اونو توي شروط جستجو آورد. بعضي مواقع هست شما ميخوايد خروجي رو بر اساس مقدارهاي يك جدول ديگه به دست آورد و همچنين راهي براي استفاده از join وجود نداره توي اين حالات يكي از روشهاي پياده سازي بصورت دستور دوستمون است. (البته اين روش از نظر سربار زماني وضعيت مناسبي نداره!)

zizi_zizi69
چهارشنبه 03 آذر 1389, 23:42 عصر
نقل قول:
آیا در عملگر Exist برای مثال کد زیر به سطری از dependent برسیم که همنام employee مورد نظر باشد، این رویه را دوباره ادامه می دهیم.یعنی برای بقیه dependent ها باز چک می کنیم؟
کد:
select E.fname
from Employee As E
where Exists
(select * from dependent where E.ssn=Essn and E.fnam=Dependent_name )
بله ، براي هر سطر جستجو رو انجام ميده.

منظور شما از جستجوی هر سطر جستجو در جدول Employee هست دیگه ؟
چون برای Exists وقتی جدول dependent چک شد و سطر مورد نظر یافت شد دیگر چرا باید بقیه سطرها رو بگرده!

Reza_Yarahmadi
پنج شنبه 04 آذر 1389, 15:34 عصر
منظور شما از جستجوی هر سطر جستجو در جدول Employee هست دیگه ؟
چون برای Exists وقتی جدول dependent چک شد و سطر مورد نظر یافت شد دیگر چرا باید بقیه سطرها رو بگرده!
دوست عزیز شروط زمان اسکن کردن رکوردها بررسی میشه ، یعنی توی مثال دوستمون به ازا هر رکورد از جدول Employee یکبار بر روی جدول dependent جستجو انجام میشه. این حالت در بعضی از مواردی که شرط وابسته به مقدار رکورد در حال اسکن نیست هم صدق میکنه چه برسه به این مثال که هر رکورد باید توی جدول دیگه جستجو بشه و در صورت وجود ، رکورد اسکن شده نمایش داده بشه. برای تست این موضوع میتونید 2تا جدول با رکوردها زیاد بسازید این موضوع رو امتحان کنید.

zizi_zizi69
پنج شنبه 04 آذر 1389, 21:48 عصر
دوستم،من منظور شما را فهمیدم .
منم منظورم همین بود شاید درست ننوشتم ،
که برای هر row در جدول Employee چک می شود ، که شرط مورد نظر با کدام یک از سطرها ی جدول dependent سازگار هست ،و به محض یافتن row مورد نظر در جدول dependent از بررسی بقیه row ها در اون جدول(dependent) دست نگه میداره و سراغ row بعدی از جدول employee می ره.
ممنون