Pregunta MySQL cláusula "CON"


Intento usar MySQL para crear una vista con la cláusula "CON"

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

Pero no parece que MySQL lo soporte.

Pensé que esto era bastante estándar y estoy seguro de que Oracle apoya esto. ¿Hay alguna forma de obligar a MySQL a usar la cláusula "CON"? Lo he intentado con el motor MyISAM e innoDB. Ambos no funcionan.


75
2017-11-28 01:43


origen


Respuestas:


Actualización: MySQL 8.0 finalmente está obteniendo la característica de las expresiones de tabla comunes, incluidos los CTE recursivos.

Aquí hay un blog que lo anuncia: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

A continuación está mi respuesta anterior, que originalmente escribí en 2008.


MySQL no admite consultas usando el WITH sintaxis definida en SQL-99, también llamada Expresiones de tabla comunes.

Esta ha sido una solicitud de características para MySQL desde enero de 2006: http://bugs.mysql.com/bug.php?id=16244

Otros productos RDBMS que admiten expresiones de tabla comunes:

Otras bases de datos que carecen de soporte para la cláusula WITH (desde febrero de 2014):


87
2017-11-28 07:49



Puede que le interese algo así como esto:

select * from (
    select * from table
) as Subquery

12
2018-02-11 21:07



Tienes la sintaxis correcta:

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

Sin embargo, como otros han mencionado, MySQL no es compatible con este comando. WITH se agregó en SQL: 1999; la versión más nueva del estándar SQL es SQL: 2008. Puede encontrar más información sobre las bases de datos compatibles con SQL: varias características de 1999 en Wikipedia.

MySQL tradicionalmente se ha retrasado un poco en soporte del estándar SQL, mientras que las bases de datos comerciales como Oracle, SQL Server (recientemente) y DB2 las han seguido un poco más de cerca. PostgreSQL es típicamente bastante compatible con los estándares también.

Es posible que desee ver la hoja de ruta de MySQL; No estoy del todo seguro de cuándo se admitirá esta característica, pero es genial para crear consultas de resumen legibles.


11
2018-05-14 17:07



Oracle no admite CON.

Se vería así.

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

@ysth WITH es difícil de buscar en Google porque es una palabra común que normalmente se excluye de las búsquedas.

Te gustaría mirar el SELECCIONAR documentos para ver cómo funciona el factoring de subconsulta.

Sé que esto no responde al OP, pero estoy limpiando cualquier confusión que pueda haber comenzado.


5
2017-11-28 02:15



¿Alguna vez has probado la Tabla temporal? Esto resolvió mi convern:

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);

Luego puede usar esta tabla en cada selección en esta sesión:

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

1
2018-02-26 08:53



Sobre la base de la respuesta de @Mosty Mostacho, aquí se explica cómo puede hacer algo equivalente en MySQL, para un caso específico de determinación de qué entradas no existen en una tabla, y no están en ninguna otra base de datos.

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

Es posible que desee utilizar un editor de texto con capacidades de macro para convertir una lista de valores en la cláusula de unión seleccionada.


1
2017-10-31 23:44



MariaDB ahora está apoyando CON. MySQL por ahora no lo es. https://mariadb.com/kb/en/mariadb/with/


0
2018-06-11 07:25