Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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

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

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.

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

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.

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.