Разница между временным представлением, созданным `WITH`, и временным представлением, созданным` CREATE TEMPORARY VIEW`? - PullRequest
0 голосов
/ 24 июня 2018

В PostgreSQL:

  1. Создает ли предложение WITH временное представление или временную таблицу? (Если я верен, представление хранит код запроса, а таблица хранит результат запроса)

  2. CREATE TEMPORARY VIEW создает временное представление, доступное только в текущем сеансе.

    Так в чем же разница между временным представлением, созданным WITH, и временным представлением, созданным CREATE TEMPORARY VIEW?

Системные концепции базы данных, по-видимому, подразумевают, что WITH создает временное представление вместо временной таблицы:

Начиная с версии SQL: 1999, стандарт SQL поддерживает ограниченную форму рекурсии, используя предложение with recursive, где представление (или временное представление) выражается в терминах себя. Рекурсивные запросы могут использоваться, например, для выражения переходное закрытие кратко. Напомним, что предложение with используется для определения временного представления , определение которого доступно только для запроса, в котором оно определено. Дополнительное ключевое слово recursive указывает, что представление является рекурсивным.

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

На самом деле они не совпадают с временными представлениями.

В 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что случайный столбец соответствует.

еще один способ сделать тот же запрос -

0 голосов
/ 24 июня 2018

Общее табличное выражение (CTE) доступно только для одного запроса.

Временное представление (например, временная таблица) доступно для всех запросов в текущем сеансе.Он удаляется в конце сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...