На самом деле они не совпадают с временными представлениями.
В Postgres CTE (предложение WITH
) материализуется в табличные объекты.в то время как представления ведут себя как макросы
, этот эффект наиболее заметен, когда один из столбцов является функцией, которая имеет побочный эффект или возвращает разные значения.
select generate_series(1,3) as n into temp table a;
простая таблица с 1, 2,3
create temporary view v as select n,random() as r from a;
select * from v as x join v as y on x.n=y.n;
Используя представление: обратите внимание, что случайный столбец не совпадает.Такой же результат можно получить, подставив выражения вида.
select x.n,random(),y.n,random()
from a as x join a as y on x.n=y.n;
или
select * from (select n,random() from a ) as x join
(select n,random() from a ) as y on x.n=y.n;
Но с CTE:
with c as (select n,random() as r from a)
select * from c as x join c as y on x.n=y.n;
с использованием примечания CTEчто случайный столбец соответствует.
еще один способ сделать тот же запрос -