J'apprends PostgreSQL et j'essaie de comprendre comment créer une table temporaire ou une WITH
déclaration pouvant être utilisée à la place d'une table normale, à des fins de débogage.
J'ai consulté la documentation de CREATE TABLE et il est indiqué VALUES
que cette requête peut être utilisée comme requête mais ne donne aucun exemple. la documentation de la VALUES
clause qui y est liée n'a pas d'exemple non plus?
Donc, j'ai écrit un test simple comme suit:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup (
key integer,
val numeric
) AS
VALUES (0,-99999), (1,100);
Mais PostgreSQL (9.3) se plaint de
erreur de syntaxe à ou proche de "AS"
Mes questions sont:
Comment puis-je corriger la déclaration ci-dessus?
Comment puis-je l'adapter pour l'utiliser dans un
WITH block
?
Merci d'avance.
postgresql
syntax
tinlyx
la source
la source
Réponses:
EDIT: Je laisse la réponse acceptée telle quelle, mais veuillez noter que la modification ci-dessous, suggérée par a_horse_with_no_name, est la méthode recommandée pour créer une table temporaire à l'aide de VALUES.
Si vous souhaitez simplement sélectionner certaines valeurs plutôt que de simplement créer un tableau et y insérer des éléments, vous pouvez procéder de la manière suivante:
Pour créer une table temporaire de la même manière, utilisez:
EDIT: Comme indiqué par a_horse_with_no_name, la documentation indique que
CREATE TABLE AS...
son fonctionnement est similaire à celui-ciSELECT INTO ...
, mais que le premier est un sur-ensemble de ce dernier etSELECT INTO
est utilisé dans plpgslq pour attribuer une valeur à une variable temporaire - il échouera donc dans ce cas. Par conséquent, bien que les exemples ci-dessus soient valides pour le SQL pur, leCREATE TABLE
formulaire doit être privilégié.Remarque, également à partir des commentaires de a_horse_with_no_name et de la question initiale du PO, cela inclut une conversion vers les types de données appropriés dans la liste de valeurs et utilise une instruction CTE (WITH).
En outre, comme indiqué dans la réponse d'Evan Carrol, une requête CTE est une barrière d'optimisation , c'est-à-dire que le CTE est toujours matérialisé. Il existe de nombreuses bonnes raisons d'utiliser des CTE, mais si elles ne sont pas utilisées avec précaution, les performances peuvent être sérieusement compromises. Cependant, dans de nombreux cas, la barrière d'optimisation peut réellement améliorer les performances. Il faut donc en prendre conscience, et non pas l'aveugler.
la source
WHERE ST_Intersects(geom, (SELECT geom FROM sometable)
ouWHERE ST_Intersects(geom, ST_Buffer(anothergeom, 10)
alors, souvent, le planificateur de requêtes n'utilise pas l'index spatial car la colonne geom n'est plus sargable. Si vous créez votre domaine d’intérêt dans un CTE initial, ce problème disparaît. C'est également très pratique si vous souhaitez utiliser le même objet dans plusieurs expressions supplémentaires dans la même requête, ce qui n'est pas inhabituel dans un contexte SIG.create table as
a besoin d'une déclaration select:Vous pouvez également réécrire ceci pour utiliser un CTE:
la source
Le problème concerne les types de données. Si vous les supprimez, la déclaration fonctionnera:
Vous pouvez définir les types en convertissant les valeurs de la première ligne:
la source
Vous n'avez vraiment pas besoin de créer une table ni d'utiliser un CTE, si tout ce dont vous avez besoin est d'utiliser quelques valeurs dans vos requêtes. Vous pouvez les aligner:
Vous pouvez ensuite obtenir un produit cartésien avec un
CROSS JOIN
(où l'autre relation peut être, bien sûr, une table, une vue, etc.). par exemple:qui donne:
Ou
JOIN
les valeurs avec une autre relation (qui peut encore être une table, une vue, etc.), par exemple:qui donne:
la source
D'abord, utilisez toujours le standard
CREATE TABLE AS
,SELECT INTO
comme suggéré dans d'autres réponses est une syntaxe obsolète depuis plus de dix ans. Vous pouvez utiliserCREATE TABLE AS
avec un CTEBien que de nombreuses réponses suggèrent d'utiliser un CTE, ce n'est pas préférable. En fait, c'est probablement un peu plus lent. Juste envelopper comme une table.
Si vous devez écrire une instruction select, vous pouvez également le faire (et vous n'avez pas besoin d'un CTE).
Un CTE dans PostgreSQL force la matérialisation. C'est une clôture d'optimisation. Pour cette raison, ce n’est généralement pas une bonne idée de les utiliser n’importe où, sauf lorsque vous en comprenez les coûts et que vous le savez pour améliorer les performances. Vous pouvez voir le ralentissement ici, par exemple,
la source
la source