sql >> データベース >  >> RDS >> MariaDB

MariaDBの「エラー1054(42S22):「on句」の不明な列「…」」を修正

    ERROR1054(42S22):「onclause」の不明な列「tab.ColName」のようなエラーが発生した場合 」MariaDBでは、次の3つの原因が考えられます。

    • 列は存在しません。
    • エイリアス列をその列名で参照しようとしています。
    • またはその逆の可能性があります。宣言されたことのないエイリアスで列を参照している可能性があります。

    列にエイリアスがある場合、ONで列を参照するときにそのエイリアスを使用する必要があります 2つ以上のテーブルに対して結合を行う場合の句。逆に、エイリアスで列を参照する場合は、最初にエイリアスが実際に宣言されていることを確認する必要があります。

    例1

    エラーを生成するコードの例を次に示します。

    SELECT 
        c.CatId,
        c.CatName
    FROM Cats c
    INNER JOIN Dogs d
    ON c.DogName = d.DogName;

    結果:

    ERROR 1054 (42S22): Unknown column 'c.DogName' in 'on clause'

    ここで誤ってc.DogNameを使用しました ONc.CatNameを使用するつもりだったときの句 。

    この場合、修正は簡単です。正しい列名を使用してください:

    SELECT 
        c.CatId,
        c.CatName
    FROM Cats c
    INNER JOIN Dogs d
    ON c.CatName = d.DogName;
    例2

    エラーを生成するコードの別の例を次に示します。

    SELECT 
        CatId,
        CatName
    FROM Cats
    INNER JOIN Dogs d
    ON c.CatName = d.DogName;

    結果:

    ERROR 1054 (42S22): Unknown column 'c.CatName' in 'on clause'

    ここでは、ONに存在しないエイリアスを参照しました 句。 c.CatNameを使用しました CatNameを参照するには Catsの列 テーブル。唯一の問題は、Cats テーブルにはエイリアスがありません。

    この問題を修正するには、Catsのエイリアスを指定するだけです。 テーブル:

    SELECT 
        CatId,
        CatName
    FROM Cats c
    INNER JOIN Dogs d
    ON c.CatName = d.DogName;

    または、エイリアスへのすべての参照を削除して、完全なテーブル名を使用することもできます:

    SELECT 
        CatId,
        CatName
    FROM Cats
    INNER JOIN Dogs
    ON Cats.CatName = Dogs.DogName;

    私が指摘しなければならないことの1つは、この例では、SELECTの列名にプレフィックスを付けていないことです。 エイリアスのリスト。それを行った場合、同じエラーが表示されますが、メッセージは少し異なります:

    SELECT 
        c.CatId,
        c.CatName
    FROM Cats
    INNER JOIN Dogs d
    ON c.CatName = d.DogName;

    結果:

    ERROR 1054 (42S22): Unknown column 'c.CatId' in 'field list'

    この場合、ONで不明な列が見つかる前に、フィールドリストで不明な列が検出されました。 句。いずれにせよ、解決策は同じです。

    例3

    エラーを生成するコードの別の例を次に示します。

    SELECT 
        c.CatId,
        c.CatName
    FROM Cats c
    INNER JOIN Dogs d
    ON Cats.CatName = d.DogName;

    結果:

    ERROR 1054 (42S22): Unknown column 'Cats.CatName' in 'on clause'

    この場合、Catsのエイリアスが宣言されています テーブルですが、ONではそのエイリアスを使用しませんでした 条項。

    ここでの解決策は、テーブル名の代わりにエイリアスを使用することです:

    SELECT 
        c.CatId,
        c.CatName
    FROM Cats c
    INNER JOIN Dogs d
    ON c.CatName = d.DogName;

    1. MySqlに相当するプロファイラーはありますか?

    2. MySQLの順序付け前にグループ化

    3. データベースフィールドを1つインクリメントします

    4. PostgreSQLでのデータウェアハウスの実行