Я изучаю PostgreSQL и пытаюсь выяснить, как создать временную таблицу или WITH
объявление, которое можно использовать вместо обычной таблицы для целей отладки.
Я посмотрел документацию по CREATE TABLE, и там написано, что она VALUES
может быть использована в качестве запроса, но не приводится пример; документация дляVALUES
оговоренного в нем предложения также не имеет примера?
Итак, я написал простой тест следующим образом:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup (
key integer,
val numeric
) AS
VALUES (0,-99999), (1,100);
Но PostgreSQL (9.3) жалуется на
синтаксическая ошибка в или около "AS"
Мои вопросы:
Как я могу исправить заявление выше?
Как я могу адаптировать его для использования в
WITH block
?
Заранее спасибо.
postgresql
syntax
tinlyx
источник
источник
Ответы:
РЕДАКТИРОВАТЬ: я оставляю исходный принятый ответ, как есть, но, пожалуйста, обратите внимание, что редактирование ниже, как предложено a_horse_with_no_name, является предпочтительным методом для создания временной таблицы с использованием VALUES.
Если вы просто хотите выбрать одно из значений, а не просто создать таблицу и вставить в нее, вы можете сделать что-то вроде:
Чтобы создать временную таблицу аналогичным образом, используйте:
РЕДАКТИРОВАТЬ: Как указано a_horse_with_no_name, в документах говорится, что
CREATE TABLE AS...
он функционально похожSELECT INTO ...
, но первый является надмножеством последнего иSELECT INTO
используется в plpgslq для присвоения значения временной переменной - поэтому он потерпит неудачу в тот случай. Поэтому, хотя приведенные выше примеры действительны для простого SQL,CREATE TABLE
форма должна быть предпочтительной.Обратите внимание, что также из комментариев a_horse_with_no_name и в исходном вопросе OP, он включает приведение к правильным типам данных в списке значений и использует оператор CTE (WITH).
Кроме того, как указывалось в ответе Эвана Кэррола, запрос CTE является забором оптимизации , т. Е. CTE всегда материализуется. Есть много веских причин для использования CTE, но может быть весьма значительное снижение производительности, если не использовать его осторожно. Однако во многих случаях барьер оптимизации может фактически повысить производительность, поэтому об этом следует помнить, а не слепо избегать.
источник
WHERE ST_Intersects(geom, (SELECT geom FROM sometable)
илиWHERE ST_Intersects(geom, ST_Buffer(anothergeom, 10)
тогда, часто планировщик запросов не использует пространственный индекс, потому что столбец geom больше не может использоваться. Если вы создаете интересующую вас область в начальном CTE, эта проблема исчезнет. Это также очень удобно, если вы хотите использовать один и тот же aoi в нескольких последующих выражениях в одном и том же запросе, что не редкость в контексте ГИС.create table as
требуется оператор выбора:Вы также можете переписать это, чтобы использовать CTE:
источник
Проблема в типах данных. Если вы удалите их, заявление будет работать:
Вы можете определить типы, приведя значения к первой строке:
источник
Вам действительно не нужно ни создавать таблицу, ни использовать CTE, если все, что вам нужно, это использовать несколько значений в ваших запросах. Вы можете включить их:
Затем вы можете получить декартово произведение с
CROSS JOIN
(где другие отношения могут быть, конечно, обычным столом, представлением и т. Д.). например:который дает:
Или
JOIN
значения с другим отношением (которое снова может быть обычной таблицей, представлением и т. Д.), Например:который дает:
источник
Сначала всегда используйте стандартизированный
CREATE TABLE AS
,SELECT INTO
как предлагалось в других ответах, является устаревшим синтаксисом уже более десяти лет. Вы можете использоватьCREATE TABLE AS
с CTEХотя многие ответы здесь предлагают использовать CTE, это не является предпочтительным. На самом деле, это, вероятно, несколько медленнее. Просто оберните это как стол.
Если вам нужно написать оператор выбора, вы тоже можете это сделать (и вам не нужен CTE).
CTE в PostgreSQL форсирует материализацию. Это забор оптимизации. По этой причине, как правило, не рекомендуется использовать их где-либо, кроме случаев, когда вы понимаете затраты и знаете, как обеспечить повышение производительности. Вы можете увидеть замедление здесь, например,
источник
источник