CTE in PostgreSQL since version 12
Starting from PostgreSQL version 12, things have changed, and two new options have been introduced for the execution of a CTE, namely MATERIALIZED
and NOT MATERIALIZED
. If we want to perform a CTE that materializes a temporary resultset, we have to add the materialized
keyword:
forumdb=> with posts_author_1 as materialized
(select p.* from posts p
inner join users u on p.author=u.pk
where username='enrico_pirozzi')
select pk,title from posts_author_1;
pk | title
----+------------------------------
3 | A view of Data types in C++
(1 row)
The query written here materializes a temporary resultset, as happened automatically in previous versions of PostgreSQL. If we write the query with the NOT MATERIALIZE
option, PostgreSQL will not materialize any temporary resultset:
forumdb=> with posts_author_1 as not materialized
(select p.* from posts p
inner join users u on p.author=u.pk
where username...