در دومین نوشته از جمع بندی کوئری ها، می خواهیم بازهم پرس و جوهای Join و Subquery را یادآوری کنیم. شکل و پرس و جوهای این نوشته از این سایت است. دو رابطه یک به چند (One-tO-Many) و چند به چند (Many-to-Many) در این شکل هست. میان دو جدول Branch و Branch Suplier رابطه یک به چند هست زیرا ستون branch_id در جدول Branch به عنوان کلید اصلی و در جدول Branch Suplier به عنوان کلید بیرونی (خارجی) است.

میان جدول های employee و client رابطه چند به چند است، پس نیاز به یک جدول میانی (Piovot Table) است که در اینجا work_with نام دارد. همانگونه که می بینید جدول work_with سه ستون هست که دو تای آن کلیدهای خارجی به دو جدول employee و client و دیگری total_sale است که مجموع فروش هر کارمند به هر مشتری را نگه می دارد.

در رابطه چند به چند، به ازای هر چند سطر در یک جدول، چندین سطر در جدول دیگر هست، بنابراین در جدول work_with به چندین مقدار ستون emp_id چندین مقدار client_id هست ولی در رابطه یک به چند، به ازای هر سطر یک جدول، چندین سطر در جدول دیگر هست. بنابراین به ازای هر سطر در جدول Branch چندین سطر در جدول Branch_Suplier هست که بدست ستون کلید بیرونی (خارجی) branch_id به سطر مورد نظر در جدول Branch دسترسی خواهیم داشت.

مثال – کد زیر اسکریپت ساده ای از Join کردن دو جدول employee و Branch را نشان می دهد.

مثال – فهرست همه کارمندانی را پیدا کنید که بالای ۵۰۰۰۰ تا یک مشتری فروش داشته اند. پرس و جوی زیر نخست بدست زیر پرس و جو، فهرست کارمندانی (empi_id) نشان داده می شود که بیش از ۵۰۰۰۰ تا تک مشتری فروش داشته اند. سپس مشخصات کارمندان (نام و نام خانوادگی) با پرس و جوی اصلی برگشت داده می شود.

مثال – فهرست همه مشتری هایی را پیدا کنید که بدست شعبه ای اداره می شوند که مدیر آن Michael Scott باشد. در اینجا از شناسه مدیر به جای نام آن کمک گرفته ایم. فهرست مشتری ها، بر اساس شعبه بدست می آید، آن هم شعبه ای که مدیرش Michael Scott باشد، پس درون زیر پرس و جو، نخست فهرست شعبه ای پیدا می شود که شناسه مدیر آن ۱۰۲ است. در اینجا زیر پرس و جو به گونه تک سطری است. پس از بدست آوردن شناسه سعبه، بدست عملگر برابری، پیش روی شرط WHERE client.branch_id همه مشتری هایی برگشت داده می شوند که شناسه شعبه آنها ۱۰۲ است

توجه کنید که برای پاسخ به این پرسش، نخست نیاز تا شناسه شعبه بدست آید و سپس به عنوان مقدار شرط، در پرس و جو اصلی به کار رود. بنابراین می توانستیم نخست با یک پرس و جو جدا (پرس و جو درونی بالا)، شناسه شعبه ای را بدست آوریم که مدیر آن شناسه ۱۰۲ دارد و سپس به گونه دستی شناسه شعبه بدست آمده را در شرط کوئری دیگری به کار بریم. ولی با بودن مفهوم پرس و جو تو در تو یا زیر کوئری ها، این دو گام را یک باره انجام می دهیم.

مثال – فهرست همه مشتری هایی را پیدا کنید که بدست شعبه ای اداره می شود که مدیر آن Michael Scott باشد. در پرس و جو بالا فرض کردیم شناسه مدیر را داریم ولی در این پرسش، فرض کرده ایم که دیگر شناسه را نداریم، پس در درونی ترین پرس و جو با توجه به نام و نام خانوادگی مدیر، شناسه آنرا پیدا می کند. توجه کنید که خود مدیر نیز یک کارمند است، پس داده های آن درون جدول employees است. دیگر پرس و جو همانند بالا است. بنابراین می توانیم بیش از دو پرس و جوی تو در تو داشته باشیم.

مثال – فهرست همه کارمندانی را پیدا کنید که با مشتری هایی کار می کنند که این مشتری ها درون شعبه scranton اداره می شوند. زیر پرس و جو زیر فهرست از جدول work_with همه شناسه های کارمندان را برگشت می دهند که هم اکنون یا پیش از این در حال کار با یک یا چندین مشتری هستند. سپس بررسی می شود که آیا شناسه برگشتی در پرس و جو اصلی درون این فهرست برگشتی است و آیا شعبه کارمند شناسه ۲ است که همان شناسه شعبه scranton است.

مثال – فهرست همه مشتری هایی را پیدا کنید که بیش از ۱۰۰۰۰ دلار خرید کرده اند.