2017-05-18 3 views
0

Dies ist eine vereinfachte Version meiner Abfrage. Es läuft in SQLite ohne ein Problem, aber nicht so in MySQL.Problem mit SQL-Join-Abfrage

Fehler: Unknown column 'tab2.key' in 'on-Klausel'

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; 

die Spalten setzen in `war leider keine Hilfe.

Ich bin mir nicht sicher, ob die Benennung einer Spalte "Schlüssel" eine gute Praxis ist (MYSQL Keywords), aber ich muss dies aufgrund bestehender Installationen irgendwie handhaben. Für einen schnellen Test habe ich die 'key'-Spalten umbenannt, aber auch ohne Erfolg.

Vielen Dank

+1

Keine Join-Notationen mischen. Der Motor kann die ANSI 89 oder die ANSI 92 nicht beide handhaben. Ich würde empfehlen, Ihre Join-Schreibweise zu ändern, um die interne Join-Notation zu verwenden. – xQbert

+1

Warum mischen Sie Join-Typen? Sie sollten die 'JOIN'-Syntax nur mit INNER, LINKS, RECHTS usw. verwenden. Warum verwenden Sie Komma-getrennte Joins im alten Stil? – ollie

+0

Warum erstellen Sie einen Alias ​​für tab2.key (als remarksId) und verwenden ihn dann überhaupt nicht im Join? – SaggingRufus

Antwort

6

Einfach gesagt, Sie keine unterschiedlichen Schreibweisen beitreten, und dann gegeben, wenn die Wahl anstelle der 89-Standard (ja die aktuelle ANSI 92-Join-Syntax verwenden ... das ist 1992 und 1989!)

Zweitens ... Aliase sind Ihnen helfen, speichern die Eingabe und mehrere Verweise auf die gleiche Tabelle behandeln .... so ... vereinfachen die Namen T1, t2, t3 ...

Schließlich .. Wenn Sie in mySQL reservierte/eingeschränkte Wörter verwenden müssen, verwenden Sie Backticks.

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

du schlägst mich dazu! – SaggingRufus

+0

Großartig, danke !!! –

+0

@ da-chiller Komma bedeutet Cross-Join. Es ist * aktuelle * Syntax. Aber es bindet nicht so fest wie explizite Joins. Es gibt stilistische Argumente gegen Komma (einschließlich anderer Leute, die unter Missverständnissen leiden), aber "nicht mischen" Argumente sind trügerisch. (Vor 5.0.12 hat MySQL keine niedrigere Priorität implementiert.) – philipxy