2016-08-03 3 views
1

ich eine SQL-Abfrage haben, die fehlschlägt, mir den Fehler geben:SQL verbindet, „gibt es einen Eintrag für die Tabelle, aber es kann nicht referenziert werden“

"There is an entry for table but it cannot be referenced from this part of the query"

Geht man durch die Abfrage, muss ich sowohl alle 3 Tabellen, aber nur Reisen und Boote haben eine übereinstimmende ID, um mitzumachen. Test ist ein Shapefile, für das ich eine postGIS-Funktion ausführen muss, aber es teilt keine ähnliche Spalten-ID mit den beiden anderen.

select trips.* 
from trips, test 
inner join boats on boats.id = trips.boat_id 
where st_intersects(trips.geom, test.geom) and 
boats.uid = 44 

Ich denke, es hat etwas mit der Join-Anweisung zu tun, aber ich verstehe nicht wirklich was. Ich würde mich sehr für eine Erklärung dessen interessieren, was hier passiert.

+1

Um zu verdeutlichen - versuchen Sie absichtlich, "Fahrten" und "Versuche" zu verbinden? – Nicarus

+0

mischen Sie keine impliziten und expliziten Joins und setzen Sie niemals Kommas in die 'from'-Klausel. –

+1

In traditioneller Weise könnte es sein "... von Reisen beitreten Test (st_intersects (trips.geom, test.geom)) beitreten Boote auf (boats.id = trips.boat_id) wo boats.uid = 44;' – Abelisto

Antwort

3

Einfache Regel: Nie Verwenden Sie Kommas in der FROM Klausel. Immer verwenden explizite JOIN Syntax. . . auch wenn das bedeutet, CROSS JOIN zu schreiben.

Wie in den Kommentaren erwähnt, ist der richtige Weg, um die Abfrage zu schreiben ist:

select trips.* 
from trips inner join 
     test 
     on st_intersects(trips.geom, test.geom) inner join 
     boats 
     on boats.id = trips.boat_id 
where boats.uid = 44; 

Doch die Frage ist, warum dies nicht funktioniert:

from trips, 
    test inner join 
    boats 
    on boats.id = trips.boat_id 

Zuerst möchte ich Beachten Sie, dass der Fehler dieser Syntax in der MySQL-Dokumentation documentation besser beschrieben ist als in der Postgres-Dokumentation:

However, the precedence of the comma operator is less than of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur. Information about dealing with this problem is given later in this section.

Ich denke, ein einfacherer Weg, dies zu beschreiben, ist, dass JOIN ein Operator ist, der auf die Tabellen/Ausdrücke einwirkt, die seine Argumente sind. Das Komma trennt die Argumente. So wird die erste Tabelle einfach nicht erkannt, weil das Komma sie "blockiert".

Ich glaube, Sie um diese mit Klammern zu bekommen:

from (trips, test inner) join 
    boats 
    on boats.id = trips.boat_id 

Sie können auf jeden Fall bekommen um es CROSS JOIN mit:

from trips cross join 
    test inner join 
    boats 
    on boats.id = trips.boat_id 

Aber warum die Mühe? Es gibt eine korrekte Möglichkeit, die Abfrage zu schreiben.

+0

Es sieht so aus, als ob der 'richtige Weg', wie hier erwähnt, davon ausgeht, dass der Join ein boolescher Wert ist. Nur für alle anderen da draußen. – hselbie

Verwandte Themen