J'ai une requête sur la base de données Sakila dans MySQL 8 (vous pouvez facilement configurer un de HTTPS : //hub.docker.com/r/1maa/sakila ). Cette requête renvoie une table vide. P> Cependant, quand je réécrire L'innertost p> dans: p> , il renvoie toutes les 2 lignes de Pourquoi est-ce? Il semble que je viens de simplifier une sélection en 2 étapes dans 1. P> J'ai également remarqué que si j'utilise Quelle est la théorie derrière cela? p> La requête est trop compliquée car elle est générée. Donc, merci de votre avis de requêtes simplifiées, mais je veux juste savoir pourquoi il ne donne pas le résultat correct. P> Et vous devez avoir MySQL 8.0.14 et supérieur à la reproduire, car les versions précédentes ne le font pas. Autoriser l'alias au-delà de 1 niveau. p> p> Store CODE> Table , que j'attends. P>
dans code> au lieu de
= code> dans
adresse_id = .. code> condition, je peux obtenir le résultat attendu. p>
3 Réponses :
La raison pour laquelle vous auriez besoin d'une clause d'une clause est parce que la SUB SELECT renvoie plusieurs résultats.
essayez-vous simplement de rejoindre les deux tables? Pourquoi ne pas utiliser une jointure au lieu des sous-sols? P>
SELECT s.* FROM store s JOIN address a ON a.address_id = s.address_id
C'est 1 rangée, pas 2 rangées qui sont renvoyées de la sous-requête, bien que le résultat final soit 2 rangées. La requête est générée, alors je veux juste savoir pourquoi cela ne fonctionne pas.
J'ai couru une explication sur votre requête en utilisant la clause in. Lorsque vous utilisez l'égal, il échoue pour correspondre parce que "Aucune ligne de correspondance de la table constante", mais je ne sais pas pourquoi ce serait.
Voir ma réponse. Il est confirmé d'être un bug.
select address_id from store _1 where store_id=_0.store_id
Voir la page manuelle MySQL suivante: dev.mysql.com/doc/refman /5.0/fr/select.html "A Select_Expr peut recevoir un alias en utilisant comme alias_name. L'alias est utilisé comme nom de colonne de l'expression et peut être utilisé dans le groupe par, commander ou passer des clauses." (...) Il n'est pas permis de faire référence à un alias de colonne dans une clause où la valeur de la colonne pourrait ne pas encore être déterminée lorsque la clause d'où est exécutée. Voir la section B.5.4.4, "Problèmes liés aux alias de colonnes". Référence: Stackoverflow.com/questions/153598/.../ a>
Désolé mais je ne pense pas que votre argument soit pertinent. Pour les deux requêtes, MySQL peut déterminer les colonnes renvoyées. Pour la 1ère requête, il peut déterminer le résultat de la requête interne est une ligne de la table code> Store code>, qui contient une colonne adresse_id code>, puis savoir que
Sélectionnez Address_id code> de celui-ci est valide.
Et votre référence concerne les alias de colonne, pas un alias de table.
J'ai signalé ceci à MySQL. Ceci est confirmé pour être un bug optimiseur: https://bugs.mysql.com/bug .php? id = 97063 . P>