web-dev-qa-db-fra.com

MySQL "WITH" clause

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 il ne semble pas que MySQL le supporte.

Je pensais que c'était assez standard et je suis sûr que Oracle le supporte. Est-il possible de forcer MySQL à utiliser la clause "WITH"? Je l'ai essayé avec les moteurs MyISAM et innoDB. Les deux ne fonctionnent pas.

80
Bill Collins

Mise à jour: MySQL 8.0 intègre enfin les expressions de table courantes, y compris les CTE récursifs.

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

Vous trouverez ci-dessous ma réponse précédente, que j'avais écrite en 2008.


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

C'est une fonctionnalité demandée par MySQL depuis janvier 2006: http://bugs.mysql.com/bug.php?id=16244

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

Autres bases de données ne prenant pas en charge la clause WITH (à partir de février 2014):

94
Bill Karwin

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

select * from (
    select * from table
) as Subquery
13
Mosty Mostacho

Vous avez la bonne syntaxe:

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é en SQL: 1999; la version la plus récente du standard SQL est SQL: 2008. Vous trouverez des informations supplémentaires sur les bases de données prenant en charge les différentes fonctionnalités de SQL: 1999 sur Wikipedia .

La prise en charge de la norme SQL a traditionnellement été légèrement retardée par MySQL, tandis que les bases de données commerciales comme Oracle, SQL Server (récemment) et DB2 les ont suivies de plus près. PostgreSQL ™ est généralement conforme aux normes.

Vous voudrez peut-être consulter la feuille de route de MySQL; Je ne suis pas tout à fait sûr de savoir quand cette fonctionnalité sera prise en charge, mais c'est très bien pour créer des requêtes de roll-up lisibles.

11
Ed Altorfer

Oracle prend en charge avec.

Cela ressemblerait à ceci.

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

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

Vous voudrez peut-être consulter le SELECT docs pour voir comment fonctionne la factorisation des sous-requêtes.

Je sais que cela ne répond pas au PO mais je dissipe toute confusion qui aurait pu commencer.

6
Mark Brady

En vous basant sur la réponse de @Mosty Mostacho, voici comment faire quelque chose d’équivalent dans MySQL, pour un cas spécifique de détermination des entrées inexistantes dans une table et ne figurant dans aucune autre base de données.

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 fonctions de macros pour convertir une liste de valeurs en une clause select citée.

2
Reuben

Avez-vous déjà essayé la table temporaire?

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 ce tableau dans chaque sélection de cette session:

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

MariaDB supporte maintenant WITH. Pour l'instant, MySQL n'est pas . https://mariadb.com/kb/en/mariadb/with/

0
Moshe L
   WITH authorRating as (select aname, rating from book)
   SELECT aname, AVG(quantity)
   FROM authorRating
   GROUP BY aname
0
Mantas Dainys