Pouvez-vous définir des tables «littérales» en SQL?

Existe-t-il une syntaxe de sousrequête SQL permettant de définir, littéralement, une table temporaire?

Par exemple, quelque chose comme

SELECT MAX(count) AS max, COUNT(*) AS count FROM ( (1 AS id, 7 AS count), (2, 6), (3, 13), (4, 12), (5, 9) ) AS mytable INNER JOIN someothertable ON someothertable.id=mytable.id 

Cela éviterait de devoir faire deux ou trois requêtes: créer une table temporaire, y placer des données, puis l’utiliser dans une jointure.

J’utilise MySQL mais je serais intéressé par d’autres bases de données qui pourraient faire quelque chose comme ça.

    Je suppose que vous pourriez faire une sous-requête avec plusieurs SELECT s combinés avec UNION s.

     SELECT a, b, c, d FROM ( SELECT 1 AS a, 2 AS b, 3 AS c, 4 AS d UNION ALL SELECT 5 , 6, 7, 8 ) AS temp; 

    Vous pouvez le faire dans PostgreSQL:

     => select * from (values (1,7), (2,6), (3,13), (4,12), (5,9) ) x(id, count); id | count ----+------- 1 | 7 2 | 6 3 | 13 4 | 12 5 | 9 

    http://www.postgresql.org/docs/8.2/static/sql-values.html

    En SQL standard (SQL 2003 – voir http://savage.net.au/SQL/ ), vous pouvez utiliser:

     INSERT INTO SomeTable(Id, Count) VALUES (1, 7), (2, 6), (3, 13), ... 

    Avec un peu plus de chasse, vous pouvez également utiliser:

     SELECT * FROM TABLE(VALUES (1,7), (2, 6), (3, 13), ...) AS SomeTable(Id, Count) 

    Que cela fonctionne dans MySQL est un problème distinct – mais vous pouvez toujours demander à le faire append, ou l’append vous-même (c’est la beauté de l’Open Source).

    Dans Microsoft T-SQL 2008, le format est le suivant:

     SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b) 

    Ie comme Jonathan mentionné ci-dessus, mais sans le mot clé ‘table’.

    Voir:

    • FROM (documents MSDN T-SQL) (sous la table dérivée), et
    • Constructeur de valeur de table (documents MSDN T-SQL)

    J’ai trouvé ce lien Tables temporaires avec MySQL

     CREATE TEMPORARY TABLE TempTable ( ID int, Name char(100) ) TYPE=HEAP; INSERT INTO TempTable VALUES( 1, "Foo bar" ); SELECT * FROM TempTable; DROP TABLE TempTable; 

    CREATE TEMPORARY TABLE (ID int, Nom char (100)) SELECT ….

    Pour en savoir plus: http://dev.mysql.com/doc/refman/5.0/fr/create-table.html

    (près du bas)

    Cela présente l’avantage que, en cas de problème de remplissage de la table (incompatibilité de type de données), la table est automatiquement supprimée.

    Une première réponse a utilisé une clause FROM SELECT. Si possible, utilisez-le car cela évite de devoir nettoyer la table.

    Le désavantage (qui peut ne pas avoir d’importance) avec FROM SELECT est la taille du jeu de données créé. Une table temporaire permet l’indexation qui peut être critique. Pour la requête suivante. Semble contre-intuitif mais même avec un dataset de taille moyenne (~ 1000 lignes), il peut être plus rapide de créer un index pour que la requête fonctionne.

    En un mot, oui. Encore mieux, si votre produit SQL prend en charge les expressions de table communes (CTE), c’est-à-dire plus facile à utiliser qu’une sous-requête, le même CTE peut être utilisé plusieurs fois, par exemple pour créer une table de nombres entiers entre 0 et 999 Serveur 2005 et supérieur:

     WITH Digits (nbr) AS ( SELECT 0 AS nbr UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ), Sequence (seq) AS ( SELECT Units.nbr + Tens.nbr + Hundreds.nbr FROM Digits AS Units CROSS JOIN Digits AS Tens CROSS JOIN Digits AS Hundreds ) SELECT S1.seq FROM Sequence AS S1; 

    sauf que vous feriez quelque chose d’utile avec la table Sequence, par exemple en analysant les caractères d’une colonne VARCHAR dans une table de base.

    Cependant, si vous utilisez cette table, qui ne contient que des valeurs littérales, plusieurs fois ou plusieurs requêtes, pourquoi ne pas en faire une table de base en premier lieu? Chaque firebase database que j’utilise possède une table de séquences d’entiers (généralement 100K lignes) car elle est généralement utile.