0
votes

Pourquoi "=" ne fonctionne pas dans cette requête SQL?

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 ). xxx

Cette requête renvoie une table vide.

Cependant, quand je réécrire L'innertost xxx

dans: xxx

, il renvoie toutes les 2 lignes de Store Table , que j'attends.

Pourquoi est-ce? Il semble que je viens de simplifier une sélection en 2 étapes dans 1.

J'ai également remarqué que si j'utilise dans au lieu de = dans adresse_id = .. condition, je peux obtenir le résultat attendu.

Quelle est la théorie derrière cela?

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.

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.


0 commentaires

3 Réponses :


1
votes

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


3 commentaires

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.



0
votes
            select address_id from store _1
            where store_id=_0.store_id

3 commentaires

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/...


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 Store , qui contient une colonne adresse_id , puis savoir que Sélectionnez Address_id de celui-ci est valide.


Et votre référence concerne les alias de colonne, pas un alias de table.