تالار گفتمان مانشت
عملگر تقسیم - نسخه‌ی قابل چاپ

عملگر تقسیم - zr2358 - 25 دى ۱۳۸۹ ۰۹:۴۳ ق.ظ

سلام
میشه یکی لطف کنه و این دستورات رو که برای r/s هست رو دیکد کنه؟
خیلی پیچیده اس. اگه کسی بلده یه توضیحی روی این کد بده
کد:
(select A,B from r)
Except
(with r1 (A,B) as
select A,B
from r
with r2 (A,B,C,D) as
select *
from r1,s
select A,B
from (r2 except r(
)
این with‌ها چکار می کنند؟

عملگر تقسیم - bijibuji - 25 دى ۱۳۸۹ ۱۱:۱۳ ب.ظ

ببینید یکم پیچیده است آره، اما به ترجمه فارسی اش دقت کنید راحت می شه:

A تقسیم بر B یعنی:
تمامی رکوردهای جدول A رو درنظر بگیر و از اونها یه سری رکورد رو حذف کن
کدوم رکوردها رو؟ اونهایی که با تک تک رکوردهای Bمتناظر نیستن.

حالا چطوری این کارو می کنه؟
فرض کنید جدول A دو فیلد R و S داره و جدول B فقط یک فیلد S

A [R,S] / B [S] = A [R] - {(A [R] x B [S]) - A [R,S]} [R]

قسمت به قسمت، فرمول بالا رو می خوام بگم:

۱-
A [R,S] / B [S]
صورت مسأله

۲-
A [R]
فیلد غیر مشترک ® بین دو جدول‌، حاوی همه رکوردهای موجود در جدول A

۳-
(A [R] x B [S])
تمامی حالات ممکن از ترکیب فیلد غیر مشترک در جدول A با فیلد مشترک در جدول B

۴-
A [R,S]
در این مرحله‌، کل رکوردهای (سطرهای) جدول A رو از مقدار محاسبه شده در مرحله قبل کم می کنیم. حاصل اش، یه سری رکورد هست که هر حالت ترکیب ممکن بین دو جدول است که در جدول A موجود نیستن. اینها رکوردهایی هستن که در در اونها R به ازای همه S‌ها ظاهر نشده

۵- در مرحله آخر کافیه‌، این مقدار رو از کل رکوردهای جدول A کم کنیم و روی ستون غیر مشترک تصویر اش کنیم

عملگر تقسیم - zr2358 - 26 دى ۱۳۸۹ ۱۲:۰۵ ق.ظ

خیلی ممنون بابت پاسختون
مگه در تفریق نباید دو جدول سازگار باشند؟
A [R] - {(A [R] x B [S]) - A [R,S]}
اینجا A[R] یک ستون R داره ولی جواب داخل آکولاد دو ستون R و S چرا؟
دوم اینکه قسمت * در کدهای بالا که نوشتم کجاست؟

عملگر تقسیم - bijibuji - 26 دى ۱۳۸۹ ۱۲:۴۱ ق.ظ

خواهش می کنم
بله همینطوره و در اینجا هم این قاعده نقض نشده
دقت کنید که بعد از اون ضرب و تفریق اش با a کل این جدول روی ستون R اش تصویر شده بعد از ستون R در جدول A کم شده

------------------

در پاسخ اولین سوال تون که این with‌ها چه می کنند، باید گفت که اینها برای تخصیص نام جدید به حاصل پرس و جو هستند.

------------------

اون قسمتی هم که ستاره زدید یعنی:

with r2 (A,B,C,D) as
select *
from r1,s

برابر با این قسمته:

([A [R] x B [S])