Oracle SDO_INSIDE funktion geht nicht

DerAskTyp

Mitglied
Code:
DROP TABLE village CASCADE CONSTRAINTS;

CREATE TABLE village (
    building_id integer PRIMARY KEY,
    name VARCHAR2(30),
    visitors integer,
    building SDO_GEOMETRY
);





/*****************index********************/
delete from user_sdo_geom_metadata where table_name = 'VILLAGE';

INSERT INTO user_sdo_geom_metadata
(    TABLE_NAME,
    COLUMN_NAME,
    DIMINFO,
    SRID
)
VALUES
(    'village',
    'building',
    SDO_DIM_ARRAY( -- 20X20 grid
        SDO_DIM_ELEMENT('X', 0, 1000, 0.5),
        SDO_DIM_ELEMENT('Y', 0, 1000, 0.5)
    ),
    NULL -- SRID
);

drop index village_idx;

CREATE INDEX village_idx ON village(building) INDEXTYPE IS MDSYS.SPATIAL_INDEX;


-- inserts
INSERT INTO village VALUES(1,'Kirche', 4,
    SDO_GEOMETRY(
        2003, 
        NULL,
        NULL,
        SDO_ELEM_INFO_ARRAY(1,1003,1), 
        SDO_ORDINATE_ARRAY(100,100, 100,120, 80,120, 80,150 ,100,200, 150,200, 150,150, 200,150, 200,120, 150,120, 150,100)
    )
);


drop table visitors;
create table visitors(
    id integer,
    position SDO_GEOMETRY );

drop sequence visitors_seq;
create sequence visitors_seq;

INSERT INTO visitors VALUES (visitors_seq.nextval,
    SDO_GEOMETRY(
        2001,
        NULL,
        SDO_POINT_TYPE(160, 100, NULL),
        NULL,
        NULL
    )
);
commit;


SELECT * FROM village  WHERE SDO_INSIDE(village.building, visitors.position) = 'TRUE';


Hallo, ich versuche zu schauen ob sich irgendeine "Visitors" innerhalb von einem Gebäude befinden bzw in der Kirche.
Beim select jedoch bekomme ich diesen fehler:

Code:
Fehler beim Start in Zeile : 70 in Befehl -
SELECT * FROM village  WHERE SDO_INSIDE(village.building, visitors.position) = 'TRUE'
Fehler bei Befehlszeile : 70 Spalte : 59
Fehlerbericht -
SQL-Fehler: ORA-00904: "VISITORS"."POSITION": ungültiger Bezeichner
00904. 00000 -  "%s: invalid identifier"
*Cause:   
*Action:

Irgendeine Vorschläge was ich falsch mache?
 
Hi

Die Spalte visitors in der Table village ist ein integer. Dieses "visitors" im Select bezeichnet die Spalte, nicht eine andere Table die zufällig gleich heißt. Und von einem int gibt es kein ".position".

Du suchst wohl irgendeinen Join oder so.
 
Hi

Die Spalte visitors in der Table village ist ein integer. Dieses "visitors" im Select bezeichnet die Spalte, nicht eine andere Table die zufällig gleich heißt. Und von einem int gibt es kein ".position".

Du suchst wohl irgendeinen Join oder so.

Das Problem ist das ich beim join kein fremdschlüssel haben. Die Spalte "visitors" gibt die max anzahl der Visitors an. d.h. ich kann kein join machen, weil ich kein "on pk=fk" machen kann. Gibt es irgendwie eine andere Möglichkeit?
 
Wie würdest du als Mensch entscheiden, welche Daten es da genau aus der Tabelle visitors nehmen soll?
 
Ich versteh leider auch nicht ganz, was das werden soll, deswegen die Frage... also langsam:

Es gibt also eine Tabelle "village", die ist vorgegeben, ok. Jedes Village hat ein Building (nur eins, warum auch immer).
Dazu gibts Visitors, jeder Visitor hat eine Position.

Deine Abfrage findet (zumindest wenn es so funktionieren würde) alle Villages, in deren Building ein bestimmter Visitor ist.
Welcher? Wie entscheidet man, welcher Visitor im Building x sein soll?

Willst du alle Villages, in deren Building "irgendein" Visitor ist? Dann brauchst du einen Join ohne Bedingung und GroupBy. Oder eine Subquery.
 
@sheel Ich brauche nur die Visitors, die innerhalb der Kirche sich befinden. d.h nur ein building. (where name like 'Kirche').

Ich habe diese folgene anweisung jetzt:
SELECT * FROM village JOIN visitor ON village.name LIKE 'Kirche' and SDO_INSIDE(village.building,visitor.position) = 'true';

Aber jetzt bekomme ich den fehler : "RA-13226: Oberfläche ohne Spatial-Index nicht unterstützt"
 
Zuletzt bearbeitet:
Oook, du suchst also nicht bestimmte VIllages/Buildings sondern bestimmte Visitors...

SQL:
SELECT id FROM visitors,village WHERE village.name="Kirche" AND SDO_INSIDE(village.building, visitors.position) = 'TRUE'
(wie gesagt, die Tabelle village sollte eher buildings heißen ... dann wäre es irgendwie klarer lesbar)

Bin mir nicht ganz sicher ob 'TRUE' nicht TRUE sein sollte, ggf. einfach ausprobieren.
 
SQL:
            SELECT * FROM visitors,village WHERE village.name like 'Kirche' AND SDO_INSIDE(village.building, visitors.POSITION) = 'TRUE';

Habe diesen Code ausgeführt. Jedoch Bekomme ich keine Reihen zurück. Habe gerade einen Visitor hinzugefügt der sich innerhalb der Kirche befindet, trotzdem bekomm ich keine Reihen zurück.
 
Zurück