sql >> Database >  >> RDS >> Mysql

Hoe kan deze SQL fout zijn? Wat zie ik niet?

Combineer SQL-89 "komma-stijl" join-syntaxis niet met SQL-92 JOIN syntaxis. Er zijn subtiele problemen met de voorrang van deze twee soorten samenvoegbewerkingen.

In jouw geval is het gevolg dat het de join-voorwaarde LEFT JOIN . evalueert voor de u tabel alias bestaat. Daarom weet het niet wat u.usr_auto_key is.

U kunt dit probleem oplossen door JOIN te gebruiken syntaxis voor alle joins:

SELECT 
  `u`.`usr_auto_key` AS `u__usr_auto_key`, 
  `s`.`set_auto_key` AS `s__set_auto_key`, 
  `u2`.`usr_auto_key` AS `u2__usr_auto_key`, 
  `u2`.`set_auto_key` AS `u2__set_auto_key`, 
  `u2`.`value` AS `u2__value` 
FROM `User` `u` JOIN `Setting` `s`
LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key` 
WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)

Ik heb geen lidmaatschapsvoorwaarde gezien tussen u en s in uw vraag, dus ik neem aan dat u van plan bent dit een Cartesiaans product te zijn?

Voor meer details over de interactie tussen de twee syntaxisformulieren voor join, zie de sectie Join Processing Changes in MySQL 5.0.12 op de pagina http://dev.mysql.com/doc/ refman/5.0/en/join.html

Re uw commentaar:Zoals ik al zei, het heeft te maken met de prioriteit van de operator. Als je een SQL-query hebt met FROM A, B JOIN C dan evalueert het de B JOIN C voordat het enige aandacht schenkt aan A -- dat omvat het toewijzen van tabelaliassen. Dus als uw deelnamevoorwaarde voor B JOIN C gebruikt de tabelalias voor A je krijgt een foutmelding omdat die alias nog niet bestaat.

Als je het omdraait en B, A JOIN C . uitvoert dan als het de join-voorwaarde voor A JOIN C . evalueert de alias voor A is beschikbaar en het werkt (in dit geval tenminste).

Maar dit is een kwetsbare oplossing, omdat je misschien ook een vraag nodig hebt die niet kan worden opgelost door gewoon A opnieuw te ordenen en B . Het is beter om gewoon te stoppen met het gebruik van de verouderde join-syntaxis met komma's. Dan heeft elke join-expressie toegang tot al uw tabelaliassen en zult u dit probleem nooit hebben bij een zoekopdracht.



  1. Een nieuwe database en nieuwe verbinding maken in Oracle SQL Developer

  2. MySQL:bladeren in een specifiek knooppunt vinden

  3. De Pearson-correlatiecoëfficiëntformule in SQL

  4. Hoe Mysql JDBC Driver naar Android Studio te Mysql?