WHERE-Klausel für Operator
-
Also ich möchte folgende SQL-Anweisung durchführen
SELECT r1.osm_id, r2.osm_id, r1.name, r2.name, SDO_RELATE(r1.geom, r2.geom, 'TOUCH') AS kreuzung FROM railways r1 JOIN railways r2 ON (r1.osm_id < r2.osm_id) WHERE kreuzung = 'TRUE';
Ich bekomme dabei die Fehlermeldung, dass ich einen ungültigen Bezeichner habe. Damit ist "kreuzung" gemeint. Also so formuliert funktioniert die Anfrage einfach nicht.
Ich habe auch schon versucht eine Subquery zu erstellen. Das sah dann so aus:
SELECT * FROM ( SELECT r1.osm_id, r2.osm_id, r1.name, r2.name, SDO_RELATE(r1.geom, r2.geom, 'TOUCH') AS kreuzung FROM railways r1 JOIN railways r2 ON (r1.osm_id < r2.osm_id) ) WHERE kreuzung = 'TRUE';
Hier kam dann die Fehlermeldung "Spalte nicht eindeutig definiert".
Kann mir jemand einen Tipp geben wie ich diese Anfrage so formulieren muss, damit sie funktioniert?
Ich will einfach nur nach dem Ergebnis des SDO_RELATE-Operators filtern. Das muss doch irgendwie zu machen sein. Ohne die Filterung mit der WHERE-Klausel klappt das ja ganz hervorragend, aber sobald ich alles rausschmeißen will, was nicht TRUE ist, krieg ich's nicht auf die Reihe.
-
Hallo
Für,deinen ersten Fall würde es reichen, wenn du die SDO_RELATE in die WHERE-Klausel schreibst anstatt dem Alias.
Bei deiner Abfrage mit dem SubQuery ist das Probelm, das du zweimal nicht eindeutige Spalten zurück lieferst (osm_id, name). Damit dies funktioniert musst den den nicht eindeutigen Spalten einen Alis geben.
Mfg Marco
-
Marc-O schrieb:
Bei deiner Abfrage mit dem SubQuery ist das Probelm, das du zweimal nicht eindeutige Spalten zurück lieferst (osm_id, name). Damit dies funktioniert musst den den nicht eindeutigen Spalten einen Alis geben.
Und der Subquery selbst muss man auch noch nen Alias geben.
-
Marc-O schrieb:
Hallo
Für,deinen ersten Fall würde es reichen, wenn du die SDO_RELATE in die WHERE-Klausel schreibst anstatt dem Alias.
OK, ich habe es jetzt also so formuliert
SELECT r1.osm_id, r2.osm_id, r1.name, r2.name FROM railways r1 JOIN railways r2 ON (r1.osm_id < r2.osm_id) WHERE SDO_RELATE(r1.geom, r2.geom, 'TOUCH') = 'TRUE';
Das funktioniert allerdings auch nicht und ich bekomme folgende Fehlermeldung
ORA-00604: Fehler auf rekursiver SQL-Ebene 1 ORA-13207: Falsche Benutzung des Operators [SDO_RELATE] ORA-06512: in "MDSYS.SDO_INDEX_METHOD_10I", Zeile 710 ORA-06512: in Zeile 4 00604. 00000 - "error occurred at recursive SQL level %s" *Cause: An error occurred while processing a recursive SQL statement (a statement applying to internal dictionary tables). *Action: If the situation described in the next error on the stack can be corrected, do so; otherwise contact Oracle Support. Fehler in Zeile: 12 Spalte: 7
Bei deiner Abfrage mit dem SubQuery ist das Probelm, das du zweimal nicht eindeutige Spalten zurück lieferst (osm_id, name). Damit dies funktioniert musst den den nicht eindeutigen Spalten einen Alis geben.
Öhm, ok. Ich dachte eigentlich, dass die Namen durch die Präfixe r1 bzw. r2 durchaus eindeutig wären.
SELECT * FROM ( SELECT r1.osm_id as r1_id, r2.osm_id as r2_id, r1.name as r1_name, r2.name as r2_name, SDO_RELATE(r1.geom, r2.geom, 'TOUCH') as kreuzung FROM railways r1 JOIN railways r2 ON (r1.osm_id < r2.osm_id) as sub ) WHERE sub.kreuzung = 'TRUE';
Und hier habe ich die Aliase alle reingesetzt. Hier bekomme ich aber den Fehler "Rechte Klammer fehlt". Und das verstehe ich jetzt überhaupt nicht. Bin ich blind? Ich sehe da keine fehlende Klammer.
-
Das "as sub" muss natürlich hinter die ")" um die Subquery.
-
SELECT * FROM ( SELECT r1.osm_id as r1_id, r2.osm_id as r2_id, r1.name as r1_name, r2.name as r2_name, SDO_RELATE(r1.geom, r2.geom, 'TOUCH') as kreuzung FROM railways r1 JOIN railways r2 ON (r1.osm_id < r2.osm_id) ) as sub WHERE sub.kreuzung = 'TRUE';
Fehlermeldung:
ORA-00933: SQL-Befehl wurde nicht korrekt beendet 00933. 00000 - "SQL command not properly ended" *Cause: *Action: Fehler in Zeile: 7 Spalte: 3
Uff...