Om du får ett felmeddelande som lyder något i stil med "ERROR 1054 (42S22):Okänd kolumn "tab.ColName" i "on-sats" ” i MariaDB, här är tre troliga orsaker:
- Kolumnen finns inte.
- Du försöker referera till en aliaskolumn med kolumnnamnet.
- Eller så kan det vara tvärtom. Du kan referera till kolumnen med ett alias som aldrig deklarerades.
Om en kolumn har ett alias måste du använda det aliaset när du refererar till det i någon ON
klausul när man gör en join mot två eller flera bord. Omvänt, om du refererar till en kolumn med ett alias, måste du se till att aliaset faktiskt deklareras i första hand.
Exempel 1
Här är ett exempel på kod som ger felet:
SELECT
c.CatId,
c.CatName
FROM Cats c
INNER JOIN Dogs d
ON c.DogName = d.DogName;
Resultat:
ERROR 1054 (42S22): Unknown column 'c.DogName' in 'on clause'
Här använde jag av misstag c.DogName
i ON
klausul när jag menade att använda c.CatName
.
I det här fallet är korrigeringen enkel. Använd rätt kolumnnamn:
SELECT
c.CatId,
c.CatName
FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;
Exempel 2
Här är ett annat exempel på kod som ger felet:
SELECT
CatId,
CatName
FROM Cats
INNER JOIN Dogs d
ON c.CatName = d.DogName;
Resultat:
ERROR 1054 (42S22): Unknown column 'c.CatName' in 'on clause'
Här refererade jag till ett icke-existerande alias i ON
klausul. Jag använde c.CatName
för att hänvisa till CatName
kolumnen i Cats
tabell. Det enda problemet är att Cats
tabellen har inget alias.
För att åtgärda det här problemet behöver vi bara tillhandahålla ett alias för Cats
tabell:
SELECT
CatId,
CatName
FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;
Alternativt kan vi ta bort alla referenser till aliaset och bara använda det fullständiga tabellnamnet:
SELECT
CatId,
CatName
FROM Cats
INNER JOIN Dogs
ON Cats.CatName = Dogs.DogName;
En sak jag bör påpeka är att vi i det här exemplet inte prefixade kolumnnamnen i SELECT
lista med aliaset. Om vi hade gjort det skulle vi ha sett samma fel, men med ett lite annorlunda meddelande:
SELECT
c.CatId,
c.CatName
FROM Cats
INNER JOIN Dogs d
ON c.CatName = d.DogName;
Resultat:
ERROR 1054 (42S22): Unknown column 'c.CatId' in 'field list'
I det här fallet upptäckte den de okända kolumnerna i fältlistan innan den hittade den i ON
klausul. Oavsett vilket är lösningen densamma.
Exempel 3
Här är ett annat exempel på kod som ger felet:
SELECT
c.CatId,
c.CatName
FROM Cats c
INNER JOIN Dogs d
ON Cats.CatName = d.DogName;
Resultat:
ERROR 1054 (42S22): Unknown column 'Cats.CatName' in 'on clause'
I det här fallet deklarerades ett alias för Cats
tabellen, men jag använde inte det aliaset i ON
klausul.
Lösningen här är att använda aliaset istället för tabellnamnet:
SELECT
c.CatId,
c.CatName
FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;