یک نمونه دیگر از Subquery براساس نتایج، Multi - Valued یا Table Expression ها هستند که بر اساس ساختار جدولی می باشند. در حقیقت Table Expression ها ما را به سمت رویکرد ماژولار می برد. یک سیستم بزرگ را به چند زیر سیستم کوچک تبدیل می کنیم و بر اساس آنها کار خود را انجام می دهیم. در نتیجه پیچیدگی کار کمتر می شود و در صورت داشتن تغییرات، فقط همان زیر سیستم رو تغییر می دهیم. انواع Table Expression ها به VIEW ، CTE ( Common Table Expression ) ، Derived Table و Inline TVF ( Inline Table value Function ) تقسیم می شود. در Table Expression ها از ORDER BY نمی توانیم استفاده کنیم، ستون های ما باید دارای نام باشند و همچنین نام ستون ها باید منحصر به فرد باشند. به آنها Table Subquery هم گفته می شود و در FROM کویری بیرونی تعریف می شود. عمر آن نیز محدود به همان FROM می باشد و بعد از آن قابل استفاده نمی باشد. در این کویری، شرکت‌هایی که بیش از سفارش داشته‌اند را نمایش می دهیم. در FROM کویری بیرونی، Subquery خود را نوشتیم و از نتایج آن در بخش Where استفاده کردیم. در یک کویری دیگر، مشتری هایی را نمایش خواهیم داد که در هر فاکتور بیش از مورد کالا سفارش داده اند. این نوع از Table Expression ، جایگزینی برای Derived Table می باشد. در Derived Table قابلیت استفاده مجدد نداشتیم اما CTE این امکان را به ما می دهد. به دو صورت بازگشتی و غیر بازگشتی قابل پیاده سازی می باشد. ساختار CTE غیر بازگشتی به این صورت می باشد. در این کویری، فهرست کد و نام شرکت مشتری های تهرانی را با استفاده از CTE غیر بازگشتی نمایش می دهیم. اگر بخواهیم نام ستون ها را تعیین کنیم، طبق ساختار باید مقابل نام CTE ، نام ستون ها را هم در نظر بگیریم. ساختار CTE تو در تو به این صورت می باشد. هر CTE ، به CTE های قبل از خودش دسترسی دارد. در این کویری، فهرست تعداد مشتریان هر سال و سال قبل از آن را نمایش می دهیم و میزان افزایش یا کاهش تعداد مشتری نسبت به سال قبل را محاسبه می کنیم. نکته: پس از تعریف چندین CTE به‌صورت تو در تو، استفاده از آن‌ها در چندین دستور جداگانه در کویری بیرونی CTE امکان‌پذیر نیست. این موضوع در مورد CTE های غیر تو در تو هم برقرار است‌. ساختار CTE بازگشتی به این صورت می باشد. قسمت CTE ، شامل دو بخش Anchor و Recursive می باشد که توسط یک set operator عملیات مربوط به آن set operator را انجام می دهیم. Anchor _ Member جایی است که ما می خواهیم از آنجا کار خود را شروع کنیم. فرض کنید یک معاون داریم، آن معاون دارای چند مدیر و هر مدیر نیز دارای چند کارشناس هستند. و ما می خواهیم زیر مجموعه آن معاون را پیدا کنیم. از طریق ساختار بازگشتی می توانیم به این هدف برسیم. در این کویری، با استفاده از CTE بازگشتی اعداد یک تا هزار را نمایش خواهیم داد. در یک ساختار CTE بازگشتی به طور پیش فرض یک حلقه تا صد بار می تواند تکرار شود. با استفاده از OPTION ( MAXRECURSION ) ، عدد مورد نظر خودم را مشخص کردیم. اگر مقدار آن را صفر بدهیم بی نهایت می شود و بیشترین عددی که می تواند بگیرد می باشد. فرض کنید یک جدول به نام Employees داریم که ساختار کارمندان ما را نمایش می دهد. هر کارمند علاوه بر EmployeeID ، یک Mgrid دارد که مقادیرش را از EmployeeID می گیرد و این جدول با خودش یک relation درختی دارد. در این کویری، زیر مجموعه های کارمند شماره را با استفاده از CTE Recursive ، نمایش می دهیم. ابتدا بخش Anchor برای کارمند شماره اجرا می شود و نتایج آن در یک جدول موقت ذخیره می شود. سپس بخش Recursive اجرا خواهد شد. همانطور که می بینید در این مرحله ارتباطی میان CTE ایجاد شده از بخش Anchor با جدول Employees برقرار شده است. مجددا بخش Recursive برای کارمند بعدی انجام می شود و این فرآیند برای تمام کارمندان اجرا خواهد شد.