Je suppose que Puzzles
n'a pas de colonne PuzzleID
. La colonne s'appelle-t-elle simplement ID
dans ce tableau ? Ou Puzzle_ID
?
Vous devez exécuter SHOW CREATE TABLE Puzzles
pour voir la définition actuelle de cette table.
Parfois, une citation manquante peut être le coupable :
... ON `Puzzles.PuzzleID` ...
Ce qui précède rechercherait une colonne littéralement nommée "Puzzles.PuzzleID
," c'est-à-dire un nom de colonne de 16 caractères avec un point au milieu.
@Bell mérite le prix pour avoir remarqué que vous mélangez des jointures de style virgule et des jointures de style SQL-92. je n'avais pas remarqué ça !
Vous ne devez pas utiliser les deux dans la même requête, car la priorité des opérations de jointure est probablement à l'origine de la confusion.
Le JOIN
mot-clé a une priorité plus élevée. En simplifiant votre requête afin que nous puissions examiner les expressions de table, elle serait évaluée comme suit :
SELECT . . .
FROM (Puzzles JOIN PuzzleCategories),
(Clients JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages)
Le problème est que la jointure à PuzzleUsages
doit être comparé au Puzzles.PuzzleID
colonne, mais en raison du problème de priorité, il ne peut pas. La colonne ne fait pas partie des opérandes du dernier JOIN
.
Vous pouvez utiliser des parenthèses pour résoudre l'erreur, en remplaçant explicitement la priorité des expressions de table (tout comme vous utiliseriez des parenthèses dans des expressions arithmétiques) :
SELECT . . .
FROM Puzzles JOIN (PuzzleCategories, Clients)
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages
Ou vous pouvez simplement utiliser SQL-92 JOIN
syntaxe cohérente. Je suis d'accord avec @Bell que c'est plus clair.
SELECT . . .
FROM Puzzles JOIN PuzzleCategories JOIN Clients
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages