sql >> Databáze >  >> RDS >> Mysql

Neznámý sloupec {0} v klauzuli

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


  1. Základy tabulkových výrazů, část 8 – CTE, úvahy o optimalizaci pokračovaly

  2. Nalezení rozdílu mezi dvěma hodnotami ve stejném sloupci v MySQL

  3. Oracle získá cizí klíče

  4. Zobrazení otevřených transakcí v MySQL