2017-05-18 12 views
0

これは私のクエリの簡略化されたバージョンです。それは問題なくSQLiteで動作しますが、MYSQLでは動作しません。SQL結合クエリの問題

エラー:不明な列 'tab2.key' '句の'

SELECT 
    tab2.key AS remarksId, 
    tab1.sessionDate AS date, 
    tab1.sessionStart AS startTime 
FROM 
    table1 AS tab1, 
    table2 AS tab2, 
    table3 AS tab3, 
    table4 AS tab4 
INNER JOIN 
    table5 AS tab5 
    ON 
    tab5.remarkId = tab2.key 
    WHERE 
    tab1.userId='<anyNumber>' AND 
    tab2.objectiveId='<anyKey>' AND 
    tab1.reportId=tab2.reportId AND 
    tab1.reportId=tab3.key AND 
    tab4.key=tab3.sortieId 
ORDER BY date, startTime; 

`残念ながら何の助けなかったの列を配置します。

'key'列の名前を付けるのが良い方法(MYSQL Keywords)であるかどうかはわかりませんが、これは何らかの形で、既存のインストールによって処理する必要があります。クイックテストでは、「キー」列の名前を変更しましたが、成功もありませんでした。

おかげ

+1

結合表記を混同しないでください。エンジンは、ANSI 89またはANSI 92の両方を処理することはできません。私は、内部結合表記法を使用するために、あなたの表記法を変更することをお勧めします。 – xQbert

+1

なぜ結合タイプを混合していますか? INNER、LEFT、RIGHTなどの 'JOIN'構文のみを使用してください。古いスタイルのコンマ区切りの結合を使用しているのはなぜですか? – ollie

+0

なぜあなたはtab2.keyの別名を(remarksIdとして)作成していて、それを結合でまったく使用していないのですか? – SaggingRufus

答えて

6

は、簡単に言えば多く、現在のANSI 92は、(代わりに89の標準の結合構文を表記に参加混ぜ、そして与えられた場合の選択肢は使用しないでくださいはい...それは1992年と1989年です!

は、第二に...別名は

最後に...あなたが入力して保存し、同じテーブルに複数の参照を扱う助け....そう...名前にT1、T2、T3を簡素化することです。.. mySQLで予約された/制限された単語を使用する必要がある場合、バックティックを使用します。

SELECT t2.`key` AS remarksId 
FROM table1 t1 
INNER JOIN table2 t2 
    ON t1.reportId = t2.reportId 
INNER JOIN table3 t3 
    ON t1.reportId = t3.`key` 
INNER JOIN table4 t4 
    ON t4.`key` = t3.sortieId 
INNER JOIN table5 t5 
    ON t5.remarkId = t2.`key` 
WHERE t1.userId = '<anyNumber>' 
    AND t2.objectiveId = '<anyKey>' 
ORDER BY `date`, startTime; 
+0

あなたはそれに私を打つ! – SaggingRufus

+0

すごく、ありがとう! –

+0

@ da-chillerコンマはクロスジョインを意味します。 *現在の*構文です。しかし、明示的な結合ほど厳重に束縛されません。カンマ(誤解に苦しんでいる他の人々も含む)に対する文法的な議論があるが、 "混同しないでください"という議論は大胆である。 (5.0.12より前は、MySQLが優先順位を低くしていませんでした)。 – philipxy