PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL-Abfrage



Dude193
04-10-2006, 10:16
Hallo..
ich soll eine vorhandene SQL-Abfrage, die auf eine Oracle-Datenbank zugreift, umschreiben, so dass sie auf eine Access-Datenbank zugreifen kann.

Kann mir jemand helfen, wie ich folgenden Befehl übertrage???
t.portfoliotypeid (+) = p.portfoliotypeid

Kenne dieses (+)= leider nicht.. Angeblich sollen dadurch aber alle Daten aus der ersten und nur die passenden aus der zweiten Spalte geliefert werden..

Vielen Dank!!! Gruss,
DUDE

Dude193
04-10-2006, 13:23
Ich möchte meine Frage nocheinmal ein wenig präzisieren.. Habe nämlich mitlerweile herausgefunden, dass dieses (+)= in Access LEFT JOIN oder RIGHT JOIN entspricht.
Habe es auch schon geschafft 2 Tabellen miteinander zuverknüpfen.. Bei mehreren bekomme ich allerdings wieder schwierigkeiten:

SELECT r.*, at.aggregationtype, rt.reporttype, t.risktype
FROM agg_info_report_config r
, agg_meta_aggregationtypes at
, agg_meta_reporttypes rt
, agg_meta_risktypes t
WHERE r.validfrom <= Format(REFERENCEDATE,'Short Date')
AND r.validto > Format(REFERENCEDATE,'Short Date')
AND at.aggregationtypeid (+) = r.aggregationtypeid
AND rt.reporttypeid (+) = r.reportid
AND t.risktypeid (+) = r.risktypeid

Diese Abfrage möchte ich umschreiben und habe es folgendermaßen versucht:

SELECT r.*, at.aggregationtype, rt.reporttype, t.risktype
FROM agg_meta_aggregationtypes at,
agg_meta_reporttypes rt,
agg_meta_risktypes t LEFT JOIN agg_info_report_config r
ON( r.validfrom <= Format(REFERENCEDATE,'Short Date')
AND r.validto > Format(REFERENCEDATE,'Short Date')
AND at.aggregationtypeid = r.aggregationtypeid
AND rt.reporttypeid = r.reportid
AND t.risktypeid = r.risktypeid)

Allerdings bekomme ich eine Fehlermeldung, dass ich JOIN falsch benutzt habe..
Bitte um HILFE ;)

Gruss und DANKE,
DUDE

Dude193
04-10-2006, 14:14
habs noch weiter verbessert, aber noch immer einen fehler irgendwo...

SELECT r.*, at.aggregationtype, rt.reporttype, t.risktype
FROM agg_info_report_config r
RIGHT JOIN agg_meta_aggregationstypes at on at.aggregationtypeid = r.aggregationtypeid
RIGHT JOIN agg_meta_reporttypes rt on rt.reporttypeid = r.reportid
RIGHT JOIN agg_meta_risktypes t on t.risktypeid = r.risktypeid
WHERE r.validfrom <= Format(REFERENCEDATE,'Short Date')
AND r.validto > Format(REFERENCEDATE,'Short Date')

Folgende Fehlermeldung wird ausgegeben:
[ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'at.aggregationtypeid = r.aggregationtypeid LEFT JOIN agg_meta_reporttypes rt on rt.reporttypeid = r.reportid LEFT JOIN agg_meta_risktypes t on t.risktypeid = r.risktypeid'."

Dude193
04-10-2006, 16:38
soo.. und am ende des Tages noch die richtige Lösung..

habs endlich geschafft *freu*

SELECT r.*, at.aggregationtype, rt.reporttype, t.risktype
FROM ((agg_info_report_config r LEFT JOIN agg_meta_reporttypes rt
ON r.[REPORTID] =rt.[REPORTTYPEID]) LEFT JOIN agg_meta_risktypes t
ON r.[RISKTYPEID] =t.[RISKTYPEID]) LEFT JOIN agg_meta_aggregationtypes at
ON r.[AGGREGATIONTYPEID] =at.[AGGREGATIONTYPEID]
WHERE r.validfrom <= Format(REFERENCEDATE,'Short Date')
AND r.validto > Format(REFERENCEDATE,'Short Date');

mwanaheri
04-10-2006, 18:16
Schön, dass wir helfen konnten :;)

sticky bit
04-10-2006, 19:39
Das (+) in Oracle meint nen OUTER JOIN, du machst aber INNER JOINs (das Schlüsselwort INNER ist optional, d. h. INNER JOIN ist equivalent zu JOIN (ohne irgendwas davor), es sei denn Access verhält sich dahingehen abweichen von Standard, was ich aber diesbzgl. nicht glaube)!
Folgende Oracle-Query


SELECT a.x,
b.y
FROM a,
b
WHERE a.z = b.z(+);

ist also equivalent zur folgenden Standard-Query


SELECT a.x,
b.y
FROM a
LEFT OUTER JOIN b
ON a.z = b.z;

.
Also ohne den Query sonst im Detail angesehn zu haben, es kann passieren, dass deine Lösung andere Ergebnisse liefert als der ursprüngliche Query, bei gleichen Daten, versteht sich.

Dude193
05-10-2006, 11:58
Ohhh.. Danke..
Dann weiß ich ja, wenn meine Daten nachher nicht stimmen sollten, was ich als erstes verändern werde!!!!

Ist zum Glück dann nur ne kleinigkeit, wenn ich das richtig verstanden habe, indem ich überall noch ein OUTER zwischenschiebe.. *hoff*

Nochmals vielen DANK!!!!!!!!