Je convertis toutes mes requêtes SQL Server en MySQL et mes requêtes qui les contiennent WITH
échouent toutes. Voici un exemple:
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
Réponses:
MySQL antérieur à la version 8.0 ne prend pas en charge la clause WITH (CTE dans le langage SQL Server; Factorisation de sous-requêtes dans Oracle), vous devez donc utiliser:
La demande pour la fonctionnalité remonte à 2006.
Comme mentionné, vous avez fourni un mauvais exemple - il n'est pas nécessaire d'effectuer une sous-sélection si vous ne modifiez en aucune façon la sortie des colonnes:
Voici un meilleur exemple:
la source
L'équipe de développeurs Mysql a annoncé que la version 8.0 aura des expressions de table communes dans MySQL (CTE) . Il sera donc possible d'écrire des requêtes comme celle-ci:
la source
Dans SQL, l'instruction with spécifie un jeu de résultats nommé temporaire, appelé expression de table commune (CTE). Il peut être utilisé pour les requêtes récursives, mais dans ce cas, il spécifie comme sous-ensemble. Si mysql autorise les sous-sélections, j'essaierais
la source
J'ai suivi le lien partagé par lisachenko et j'ai trouvé un autre lien vers ce blog: http://guilhembichot.blogspot.co.uk/2013/11/with-recursive-and-mysql.html
Le post présente des moyens d'émuler les 2 utilisations de SQL WITH. Vraiment bonne explication sur la façon dont ceux-ci fonctionnent pour faire une requête similaire à SQL WITH.
1) Utilisez WITH pour ne pas avoir à effectuer la même sous-requête plusieurs fois
2) Les requêtes récursives peuvent être effectuées avec une procédure stockée qui rend l'appel similaire à une requête récursive.
Et c'est le code ou la procédure stockée
la source
La fonction 'Common Table Expression' n'est pas disponible dans MySQL, il faut donc aller faire une vue ou une table temporaire à résoudre, ici j'ai utilisé une table temporaire.
La procédure stockée mentionnée ici résoudra votre besoin. Si je veux obtenir tous les membres de mon équipe et leurs membres associés, cette procédure stockée aidera:
Code:
Cela peut être appelé en utilisant:
la source
Cette fonctionnalité est appelée une expression de table commune http://msdn.microsoft.com/en-us/library/ms190766.aspx
Vous ne pourrez pas faire exactement la chose dans mySQL, la chose la plus simple serait probablement de créer une vue qui reflète cette CTE et de simplement la sélectionner dans la vue. Vous pouvez le faire avec des sous-requêtes, mais cela fonctionnera très mal. Si vous rencontrez des CTE qui font de la récursivité, je ne sais pas comment vous pourriez recréer cela sans utiliser de procédures stockées.
EDIT: Comme je l'ai dit dans mon commentaire, cet exemple que vous avez posté n'a pas besoin d'un CTE, vous devez donc l'avoir simplifié pour la question car il peut être simplement écrit comme
la source
CREATE/DROP VIEW
) et vous pouvez accorder des privilèges sur une vue.J'ai aimé la réponse de @ Brad dans ce fil , mais je voulais un moyen d'enregistrer les résultats pour un traitement ultérieur (MySql 8):
Ce qui produit:
la source