nanunana Geschrieben 4. Dezember 2007 Geschrieben 4. Dezember 2007 Hallo zusammen, ich habe folgendes, ich habe 4 Tabellen, und in den 4 Tabellen gibt es jeweils eine Spalte, die in den 4 tabellen gleich ausieht mal zu viel oder mal weniger mit einträgen befühlt. aber die 4 spalten über die 4 Tabellen haben einige gemeinsame ID. Nun, ich möchte über das, was die tabellen gemeinsam( gemeinsame ID)haben eine neue Tabelle befüllen und ich schreibe in meiner where bedingung folgendes: where tab1.spalteID = tab2.spalteID and tab2.spalteID = tab3.spalteID and tab3.spalteID= tab4.spalteID NUN tab1 hat 10000ID, tab2 hat 5000ID, tab3 hat 10000, tab4 7000...diese ID sind primärschlüssel dieser 4Tabellen und gleich in diesen 4Tabellen, nur in manchen Tabellen nicht vollständig wenn ich meine Wehre so habe, kriege ich in der neuen Tabelle 20000 zeilen, und das darf nicht sein. ich muss doch soviel zeilen in meiner neuen Tabelle haben wie die Tabelle mit der Minimalen ID_Zeilenanzahl. wenn ich über die Varianteausprobiere: where tab1.spalteID = tab2.spalteID = tab3.spalteID = tab4.spalteID dann bekomme ich einen Fehler : where nicht richtig geschrieben Hat jemand eine Idee. Gruss Zitieren
Jan Jansen Geschrieben 4. Dezember 2007 Geschrieben 4. Dezember 2007 Deine erste Wherebedingung sollte richtig sein. Besteht der Primärschlüssel eventuell aus mehr als einem Feld? Sind in den Tabellen Duplikate vorhanden? Versuch mal ein SELECT DISTINCT auf das Schlüsselfeld Zitieren
nanunana Geschrieben 4. Dezember 2007 Autor Geschrieben 4. Dezember 2007 Hallo jan, wo soll ich den select DISTINCT setzen, mein Befehl sieht so aus: insert into Tabelle (spalten1,.....) select ..,...,...,.., from aus meiner 4Tabellen where tab1.spalteID = tab2.spalteID and tab2.spalteID = tab3.spalteID and tab3.spalteID= tab4.spalteID Danke Zitieren
flashpixx Geschrieben 4. Dezember 2007 Geschrieben 4. Dezember 2007 Das lässt sich nicht so nachvollziehen, ich gehe davon auch aus, dass irgendwas mit Deinen Schlüsseln nicht passt. Den aus Tabelle1 und 2 wird das karthesische Produkt gebildet, die Datensätze die gleich sind bleiben erhalten, analog dann 3 und 4 [und es müsste ja so aussehn: (((tabelle1 x tabelle2) x tabelle3) x tabelle4 und da es assoziativ ist, sollte es klappen] Bei einem Select * werden natürlich aus allen 4 Tabellen die Felder gelesen. Ich würde Dir evtl raten, das ganze als Join zu formulieren, da die Laufzeit dadurch wesentlich besser ist Evtl postest Du mal Dein Create Table HTH Phil Zitieren
dr.dimitri Geschrieben 5. Dezember 2007 Geschrieben 5. Dezember 2007 Den aus Tabelle1 und 2 wird das karthesische Produkt gebildet, die Datensätze die gleich sind bleiben erhalten, analog dann 3 und 4 [und es müsste ja so aussehn: (((tabelle1 x tabelle2) x tabelle3) x tabelle4 und da es assoziativ ist, sollte es klappen] Wie kommst Du denn da drauf? SQL> create table t1 (c1 number); Tabelle wurde erstellt. SQL> SQL> create table t2 (c2 number); Tabelle wurde erstellt. SQL> SQL> create table t3 (c3 number); Tabelle wurde erstellt. SQL> SQL> create table t4 (c4 number); Tabelle wurde erstellt. SQL> explain plan for 2 select t1.c1 from t1,t2,t3,t4 3 where t1.c1=t2.c2 4 and t2.c2=t3.c3 5 and t3.c3=t4.c4; EXPLAIN PLAN ausgef³hrt. SQL> SQL> select * from table(dbms_xplan.display); -------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost | -------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 82 | 4264 | 11 | | 1 | HASH JOIN | | 82 | 4264 | 11 | | 2 | HASH JOIN | | 82 | 3198 | 8 | | 3 | HASH JOIN | | 82 | 2132 | 5 | | 4 | TABLE ACCESS FULL| T1 | 82 | 1066 | 2 | | 5 | TABLE ACCESS FULL| T2 | 82 | 1066 | 2 | | 6 | TABLE ACCESS FULL | T3 | 82 | 1066 | 2 | | 7 | TABLE ACCESS FULL | T4 | 82 | 1066 | 2 | -------------------------------------------------------------------- Oracle ist der Meinung, dass es sich hier nicht im ein kartesisches Produkt handelt. Ich würde Dir evtl raten, das ganze als Join zu formulieren, da die Laufzeit dadurch wesentlich besser ist Das ist ein JOIN. wo soll ich den select DISTINCT setzen SELECT DISTINCT ... Damit werden doppelte Datensätze eingedampft. Zitieren
nanunana Geschrieben 5. Dezember 2007 Autor Geschrieben 5. Dezember 2007 Hallo dim ; Ich würde Dir evtl raten, das ganze als Join zu formulieren, da die Laufzeit dadurch wesentlich besser ist Das ist ein JOIN. ich bin auch der Meinung. SQL> explain plan for 2 select t1.c1 from t1,t2,t3,t4 3 where t1.c1=t2.c2 4 and t2.c2=t3.c3 5 and t3.c3=t4.c4; EXPLAIN PLAN ausgef³hrt. beschreibt explain Plan meine Verknüpfung , die ich durch meine where gemacht habe ?? was soll ich vom, Rows | Bytes | Cost , ablesen ? Danke Zitieren
Jan Jansen Geschrieben 5. Dezember 2007 Geschrieben 5. Dezember 2007 prüfe erstmal komplett ohne Joins/Where deine Daten: SELECT DISTINCT spalteID FROM tabelle1; SELECT DISTINCT spalteID FROM tabelle2; SELECT DISTINCT spalteID FROM tabelle3; SELECT DISTINCT spalteID FROM tabelle4; und schau dir Anzahl der Datensätze an Wenn die Anzahl gleich bleibt, wird es spannend, wenn nicht prüfe ob dein Primärschlüssel aus mehr als einem Feld besteht. Zitieren
dr.dimitri Geschrieben 5. Dezember 2007 Geschrieben 5. Dezember 2007 beschreibt explain Plan meine Verknüpfung , die ich durch meine where gemacht habe ?? Ja, das ist der Ausführungsplan den der Optimizer errechnet hat. was soll ich vom, Rows | Bytes | Cost , ablesen ? Das ist die Anzahl Zeilen und Bytes die der Optimizer vermutet. Allerdings wurden meine Tabellen nicht analysiert und daher basieren diese Zahlen auf Standardwerten die der Optimizer in diesem Fall verwendet - sind also in diesem Beispiel nicht mal annähernd korrekt. Dim Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.