Hádal bych Puzzles
nemá sloupec PuzzleID
. Je sloupec nazván jednoduše ID
v té tabulce? Nebo Puzzle_ID
?
Měli byste spustit SHOW CREATE TABLE Puzzles
zobrazíte aktuální definici této tabulky.
Někdy může být na vině chybějící citace:
... ON `Puzzles.PuzzleID` ...
Výše uvedené by hledalo sloupec s doslovným názvem „Puzzles.PuzzleID
“, tedy název sloupce o délce 16 znaků s tečkou uprostřed.
@Bell si zaslouží cenu za to, že si všiml, že mícháte spojení ve stylu čárky a spojení ve stylu SQL-92. To jsem si nevšiml!
Neměli byste používat oba ve stejném dotazu, protože priorita operací spojení pravděpodobně způsobuje zmatek.
JOIN
klíčové slovo má vyšší prioritu. Zjednodušení vašeho dotazu, abychom se mohli podívat na tabulkové výrazy, by bylo vyhodnoceno následovně:
SELECT . . .
FROM (Puzzles JOIN PuzzleCategories),
(Clients JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages)
Problém je v připojení k PuzzleUsages
potřebuje porovnat s Puzzles.PuzzleID
sloupec, ale kvůli problému s prioritou nemůže. Sloupec není součástí operandů posledního JOIN
.
K vyřešení chyby můžete použít závorky, které explicitně přepíší prioritu tabulkových výrazů (stejně jako byste používali závorky v aritmetických výrazech):
SELECT . . .
FROM Puzzles JOIN (PuzzleCategories, Clients)
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages
Nebo můžete jednoduše použít SQL-92 JOIN
syntaxe konzistentně. Souhlasím s @Bell, že je to jasnější.
SELECT . . .
FROM Puzzles JOIN PuzzleCategories JOIN Clients
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages