Estoy convirtiendo todas mis consultas de SQL Server a MySQL y todas mis consultas que tienen WITH
en ellas están fallando. He aquí un ejemplo:
WITH t1 AS
(
SELECT article.*, userinfo.*, category.*
FROM question
INNER JOIN userinfo ON userinfo.user_userid = article.article_ownerid
INNER JOIN category ON article.article_categoryid = category.catid
WHERE article.article_isdeleted = 0
)
SELECT t1.*
FROM t1
ORDER BY t1.article_date DESC
LIMIT 1, 3
Respuestas:
MySQL anterior a la versión 8.0 no es compatible con la cláusula WITH (CTE en el lenguaje de SQL Server; Factorización de subconsultas en Oracle), por lo que le queda usar:
La solicitud de la función se remonta a 2006.
Como se mencionó, proporcionó un ejemplo deficiente: no es necesario realizar una subselección si no está alterando la salida de las columnas de ninguna manera:
He aquí un mejor ejemplo:
fuente
El equipo de desarrolladores de Mysql anunció que la versión 8.0 tendrá expresiones de tabla comunes en MySQL (CTE) . Entonces será posible escribir consultas como esta:
fuente
En Sql, la declaración with especifica un conjunto de resultados con nombre temporal, conocido como expresión de tabla común (CTE). Puede usarse para consultas recursivas, pero en este caso, se especifica como subconjunto. Si mysql permite subselectes, lo intentaría
fuente
Seguí el enlace compartido por lisachenko y encontré otro enlace a este blog: http://guilhembichot.blogspot.co.uk/2013/11/with-recursive-and-mysql.html
La publicación presenta formas de emular los 2 usos de SQL WITH. Muy buena explicación sobre cómo funcionan para hacer una consulta similar a SQL WITH.
1) Use WITH para no tener que realizar la misma subconsulta varias veces
2) Las consultas recursivas se pueden realizar con un procedimiento almacenado que hace que la llamada sea similar a una consulta recursiva.
Y este es el código o el procedimiento almacenado
fuente
La función 'Expresión de tabla común' no está disponible en MySQL, por lo que debe ir a hacer una vista o tabla temporal para resolver, aquí he usado una tabla temporal.
El procedimiento almacenado mencionado aquí resolverá su necesidad. Si quiero obtener todos los miembros de mi equipo y sus miembros asociados, este procedimiento almacenado ayudará:
Código:
Esto se puede llamar usando:
fuente
Esa característica se denomina expresión de tabla común http://msdn.microsoft.com/en-us/library/ms190766.aspx
No podrá hacer exactamente lo mismo en mySQL, lo más fácil probablemente sería crear una vista que refleje ese CTE y simplemente seleccionar de la vista. Puede hacerlo con subconsultas, pero funcionará muy mal. Si se encuentra con algún CTE que haga recursividad, no sé cómo podría volver a crearlo sin usar procedimientos almacenados.
EDITAR: Como dije en mi comentario, ese ejemplo que publicó no necesita un CTE, por lo que debe haberlo simplificado para la pregunta, ya que se puede escribir simplemente como
fuente
CREATE/DROP VIEW
) y puede otorgar privilegios sobre una vista.Me gustó la respuesta de @ Brad de este hilo , pero quería una forma de guardar los resultados para su posterior procesamiento (MySql 8):
Que produce:
fuente