sql >> Databasteknik >  >> RDS >> Mysql

Hur kan denna SQL vara fel? Vad är det jag inte ser?

Blanda inte SQL-89 "comma-style" join-syntax med SQL-92 JOIN syntax. Det finns subtila problem med företrädet för dessa två typer av sammanfogningsoperationer.

I ditt fall är konsekvensen att det utvärderar anslutningsvillkoret LEFT JOIN före u tabellalias finns. Det är därför den inte vet vilken u.usr_auto_key är.

Du kan åtgärda detta problem genom att använda JOIN syntax för alla kopplingar:

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)

Jag såg inget kopplingsvillkor mellan u och s i din fråga, så jag antar att du tänker vara en kartesisk produkt?

För mer information om interaktionen mellan de två syntaxformerna för join, se avsnittet Join Processing Changes in MySQL 5.0.12 på sidan http://dev.mysql.com/doc/ refman/5.0/en/join.html

Angående din kommentar:Det har som sagt att göra med operatörsföreträde. Om du har en SQL-fråga med FROM A, B JOIN C sedan utvärderar den B JOIN C innan den uppmärksammar A -- som inkluderar tilldelning av tabellalias. Så om ditt anslutningsvillkor för B JOIN C använder tabellaliaset för A du får ett felmeddelande eftersom det aliaset inte finns ännu.

Om du vänder på det och kör B, A JOIN C sedan när den utvärderar kopplingsvillkoret för A JOIN C aliaset för A är tillgängligt och det fungerar (i det här fallet åtminstone).

Men det här är en bräcklig lösning, eftersom du kanske också behöver en fråga som inte kan fixas bara genom att ordna om A och B . Det är bättre att bara sluta använda den föråldrade joinsyntaxen med kommatecken. Då har vilket join-uttryck som helst tillgång till alla dina tabellalias och du kommer aldrig att ha det här problemet i någon fråga.



  1. SQL-fel:0, SQLState:08S01 Kommunikationslänkfel

  2. Hur WooCommerce-kuponger lagras i databasen?

  3. SQL-fel Jag kan inte lista ut detta

  4. Analysera filnamn och sökväg från fullständig sökväg