Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben
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.

Geschrieben

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

Geschrieben

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.

Geschrieben
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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...