Clause MySQL “WITH”

J’essaie d’utiliser MySQL pour créer une vue avec la clause “WITH”

WITH authorRating(aname, rating) AS SELECT aname, AVG(quantity) FROM book GROUP BY aname 

Mais MySQL ne supporte pas cela.

Je pensais que c’était assez standard et je suis sûr que Oracle supporte cela. Y at-il de toute façon de forcer MySQL à utiliser la clause “WITH”? Je l’ai essayé avec le moteur MyISAM et innoDB. Les deux ne fonctionnent pas.

Mise à jour: MySQL 8.0 obtient enfin la fonctionnalité des expressions de table communes, y compris les CTE récursifs.

Voici un blog qui l’annonce: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

Ci-dessous ma réponse précédente, que j’ai écrite en 2008.


MySQL ne prend pas en charge les requêtes utilisant la syntaxe WITH définie dans SQL-99, également appelée Common Table Expressions.

Ceci est une demande de fonctionnalité pour MySQL depuis janvier 2006: http://bugs.mysql.com/bug.php?id=16244

Autres produits SGBDR prenant en charge les expressions de table communes:

Autres bases de données non compatibles avec la clause WITH (à partir de février 2014):

Vous pourriez être intéressé par quelque chose comme ceci:

 select * from ( select * from table ) as Subquery 

Vous avez la syntaxe à droite:

 WITH AuthorRating(AuthorName, AuthorRating) AS SELECT aname AS AuthorName, AVG(quantity) AS AuthorRating FROM Book GROUP By Book.aname 

Cependant, comme d’autres l’ont mentionné, MySQL ne supporte pas cette commande. WITH a été ajouté dans SQL: 1999; La dernière version du standard SQL est SQL: 2008. Vous pouvez trouver plus d’informations sur les bases de données prenant en charge les différentes fonctionnalités de SQL: 1999 sur Wikipedia .

MySQL a traditionnellement un peu tardé à prendre en charge le standard SQL, alors que les bases de données commerciales comme Oracle, SQL Server (récemment) et DB2 les ont suivies de plus près. PostgreSQL est également assez conforme aux normes.

Vous voudrez peut-être regarder la feuille de route de MySQL; Je ne suis pas tout à fait sûr de savoir si cette fonctionnalité pourrait être prise en charge, mais elle est idéale pour créer des requêtes de type roll-up lisibles.

Oracle prend en charge WITH.

Ça ressemblerait à ça.

 WITH emps as (SELECT * FROM Employees) SELECT * FROM emps WHERE ID < 20 UNION ALL SELECT * FROM emps where Sex = 'F' 

@ysth WITH est difficile à Google car c'est un mot commun généralement exclu des recherches.

Vous voudriez regarder les documents SELECT pour voir comment la factorisation de la sous-requête fonctionne.

Je sais que cela ne répond pas à l'OP, mais je supprime toute confusion qui pourrait avoir commencé.

Avez-vous déjà essayé la table temporaire? Cela a résolu mon problème:

 create temporary table abc ( column1 varchar(255) column2 decimal ); insert into abc select ... or otherwise insert into abc values ('text', 5.5), ('text2', 0815.8); 

Ensuite, vous pouvez utiliser cette table dans chaque sélection de cette session:

 select * from abc inner join users on ...; 

En vous basant sur la réponse de @Mosty Mostacho, voici comment vous pouvez faire quelque chose d’équivalent dans MySQL, pour déterminer précisément quelles entrées n’existent pas dans une table et ne sont dans aucune autre firebase database.

 select col1 from ( select 'value1' as col1 union select 'value2' as col1 union select 'value3' as col1 ) as subquery left join mytable as mytable.mycol = col1 where mytable.mycol is null order by col1 

Vous souhaiterez peut-être utiliser un éditeur de texte doté de fonctionnalités de macro pour convertir une liste de valeurs en une clause select union.

MariaDB supporte maintenant WITH. MySQL pour le moment n’est pas. https://mariadb.com/kb/en/mariadb/with/