בתקן SQL 99, נוספה תמיכה לביטוי רב עוצמה אשר קיבל את השם Common Table Expression או CTE בקיצור.
נכון לזמן כתיבת הפוסט הזה, ישנם מעט מאוד מסדי נתונים אשר תומכים בזה, כאשר בעולם הקוד הפתוח אני מכיר רק 2 שהם Firebird ו PostgreSQL.
CTE בעצם מאפשר לנו ליצור מעין טבלה זמנית עבור code block של SQL. כלומר נגיד ויש select קבוע שאני רוצה עליו לבצע עוד select, אבל הselect המקורי מכיל כל מיני תנאים וכו', ויותר מזה, יכול להיות שאני רוצה להשתמש באותה שאילתא ביותר ממקום אחד, אז CTE בעצם נכנס לשימוש. הוא יודע להגיע ב"טעם" רגיל וב"טעם" שהוא רקורסיבי:
with Machines as ( select id, type, name, ip from Computers where type in (1, 8, 34) and ip like '192.168%' ); select user from CompanyUsers cu left join Machines on cu.machine = Machines.id;
עוד צורת שימוש שיש ל CTE היא בצורה רקורסיבית על המידע:
with recursive
dept_year_budget as (
select fiscal_year,
dept_no,
sum(projected_budget) as budget
from proj_dept_budget
group by fiscal_year, dept_no
),
dept_tree as (
select dept_no,
head_dept,
department,
cast('' as varchar(255)) as indent
from department
where head_dept is null
union all
select d.dept_no,
d.head_dept,
d.department,
h.indent || ' '
from department d
join dept_tree h on d.head_dept = h.dept_no
)
select d.dept_no,
d.indent || d.department as department,
dyb_2008.budget as budget_08,
dyb_2009.budget as budget_09
from dept_tree d
left join dept_year_budget dyb_2008
on d.dept_no = dyb_2008.dept_no
and dyb_2008.fiscal_year = 2008
left join dept_year_budget dyb_2009
on d.dept_no = dyb_2009.dept_no
and dyb_2009.fiscal_year = 2009