Autor |
Beitrag |
Schneehase
Hält's aus hier
Beiträge: 2
|
Verfasst: Di 31.08.04 13:34
Hallo zusammen!!!
Ich habe vier Tabellen mit folgenden Daten:
1. Tabelle
foezuordnung
pronr;foenr;tabnr
1;1;1
1;2;1
2. Tabelle
Projekte
pronr;proname
1;test projekt
3. Tabelle
Foerderer
foenr;foename
1;foerderer1
2;foerderer2
4. Tabelle
Tabellen
tabnr;tabname
1;Tabelle1
Meine dazugehörige SQL lautet:
Quelltext 1: 2: 3: 4: 5:
| SELECT foezuordnung.pronr, projekte.proname ,foezuordnung.foenr,foerderer.foename,foezuordnung.tabnr,tabellen.tabname FROM foezuordnung INNER JOIN projekte ON (foezuordnung.pronr=projekte.pronr) INNER JOIN foerderer ON (foezuordnung.foenr=foerderer.foenr) INNER JOIN tabellen ON (foezuordnung.tabnr=tabellen.tabnr) | Leider bekomme ich als Ergebnis nur den Datensatz:
1;projekt1;1;foerderer1;1;Tabelle1
zurück.
Wieso fehlt der DS mit dem Förderer 2? Hat jemand einen Tipp für mich!!!
Danke schonmal im voraus!
Gruß
René Albrecht
|
|
j-a-n@gmx.de
      
Beiträge: 84
Delphi 7
|
Verfasst: Di 31.08.04 15:41
|
|
nike
      
Beiträge: 48
Win 2K, Win XP
D5 Ent.
|
Verfasst: Mi 01.09.04 12:09
Hallo!
Das Problem ist, das in der Tabelle Projekte nur eins aufgefuehrt ist (Nr. 1). Durch den Inner Join werden nur solche Spalten verknuepft, bei denen beide Tabellen mit dem ON-Attribut uebereinstimmen. Daher wird das Projekt 2 abgeschnitten.
Vielleicht hilft die ein LEFT JOIN bei dem SQL:
SELECT foezuordnung.pronr, projekte.proname ,foezuordnung.foenr,foerderer.foename,foezuordnung.tabnr,tabellen.tabname
Quelltext 1: 2: 3: 4:
| FROM foezuordnung LEFT JOIN projekte ON (foezuordnung.pronr=projekte.pronr) INNER JOIN foerderer ON (foezuordnung.foenr=foerderer.foenr) LEFT JOIN tabellen ON (foezuordnung.tabnr=tabellen.tabnr) |
Die Projektezeile wird dann mit NULL-Werten aufgefuellt beim 2. Projekt, da nicht existent. Das gleiche gilt auch fuer die ausdrucksstarke Tabelle 'tabellen'.
Gruss
nike
|
|
j-a-n@gmx.de
      
Beiträge: 84
Delphi 7
|
Verfasst: Mi 01.09.04 12:18
@nike
das ist so schon richtig.
allerdings wird in der zuordnungstabelle gar nicht auf projekt 2 verwiesen und darf daher gar nicht angezeigt werden.
förderer 2 sollte mit projekt 1 und tabelle 1 angezeigt werden.
|
|
nike
      
Beiträge: 48
Win 2K, Win XP
D5 Ent.
|
Verfasst: Mi 01.09.04 14:32
Hi!
Ups - habe wohl etwas schnell gelesen. Habe das ganze unter Access eben nachgebaut und klappt auf Anhieb mit (allerdings Access-spezifischer Notation):
Quelltext 1: 2: 3: 4:
| SELECT [foezuordnung].[pronr], [projekte].[proname], [foezuordnung].[foenr], [foerderer].[foename], [foezuordnung].[tabnr], [tabellen].[tabname] FROM ((foezuordnung INNER JOIN Foerderer ON [foezuordnung].[foenr]=[Foerderer].[foenr]) INNER JOIN Projekte ON [foezuordnung].[pronr]=[Projekte].[pronr]) INNER JOIN Tabellen ON [foezuordnung].[tabnr]=[Tabellen].[tabnr]; |
Einziger Unterschied ist die Klammerung.
Welche DB nutzt Du Schneehase?
Gruss
nike
|
|
Schneehase 
Hält's aus hier
Beiträge: 2
|
Verfasst: Do 02.09.04 14:55
|
|
neojones
      
Beiträge: 1206
Erhaltene Danke: 1
|
Verfasst: Do 02.09.04 15:05
j-a-n@gmx.de: Mein altes Steckenpferd, ich sags immer wieder
Mit Deiner Variante kannst Du Dir bei größeren Datenbanken alles zerschiessen. Hintergrund:
Wenn im FROM mehrere Tabellen stehen wird daraus zunächst das kartesische Produkt abgebildet, also jeder Datensatz jeder Tabelle mit jedem Datensatz jeder anderen Tabelle verknüpft. Daraus entsteht eine gigantische virtuelle Datenmenge die eventuell die Leistung des Servers übersteigt. Bei mySQL könnte dann sogar Datenverlust vorkommen...
Es gibt IMHO vielleicht nur 2 oder 3 Anwendungsbereiche, wo man das kartesische Produkt braucht, aber generell ist davon abzuraten.
@schneehase: die eckigen Klammern weglassen, dann hast ne konforme Notation die laufen sollte.
_________________ Ha! Es compiliert! Wir können ausliefern!
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Fr 03.09.04 08:02
neojones hat folgendes geschrieben: | Mit Deiner Variante kannst Du Dir bei größeren Datenbanken alles zerschiessen. |
Bisschen OT, aber trotzdem ein kleiner Hinweis: Das mit dem kartesischen Produkt ist nicht bei jeder Datenbank so. Als Beispiel nehme ich DB2 her, da ist sogar dieses Verfahren schneller als über JOINS. Fragt mich nicht warum, aber die IBM-Datenbank dröselt das vorher so schön auf und optimiert das, dass es so ist. Ich habe es selbst mit über 1,5 Mio Datensätzen ausprobiert und war erstaunt ....
|
|
neojones
      
Beiträge: 1206
Erhaltene Danke: 1
|
Verfasst: Fr 03.09.04 10:53
Stimmt, DB2 ist aber von der Grundtechnik im Datenbankkern auch keine richtige relationale Datenbank  Gibt auch noch ein paar Ausnahmen bei Datenbanken, wo das von mir geschriebene nicht (ganz) stimmt. Aber im Regelfall isses leider (oder Gott sei Dank) so 
_________________ Ha! Es compiliert! Wir können ausliefern!
|
|
j-a-n@gmx.de
      
Beiträge: 84
Delphi 7
|
Verfasst: Mi 04.05.05 11:28
Sorry, dass ich erst jetzt antworte bzw. weiterfrage.
neojones hat folgendes geschrieben: |
Wenn im FROM mehrere Tabellen stehen wird daraus zunächst das kartesische Produkt abgebildet, also jeder Datensatz jeder Tabelle mit jedem Datensatz jeder anderen Tabelle verknüpft. Daraus entsteht eine gigantische virtuelle Datenmenge die eventuell die Leistung des Servers übersteigt. Bei mySQL könnte dann sogar Datenverlust vorkommen...
|
Hmm.. so habe ich es auch mal gelernt, allerdings in der Theorie. Eine Datenbank hat aber vorher einen optimierer, der sich so was anschaut und optimals löst. da du mysql erwähnst, muss ich dir da eindeutig widersprechen. MySQL bietet (wie andere db's auch) den "explain" befehl, welcher erklärt, was mysql wirklich macht. Die gleiche Abfrage, einmal mit wheres und einmal mit joins liefert das gleiche ergebnis!.
Jetzt wäre für mich nur noch interessant, ob paradox das auch macht oder zu d..f dazu ist.
Moderiert von Motzi: Quote-Tags korrigiert.
_________________ --
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.
|
|
neojones
      
Beiträge: 1206
Erhaltene Danke: 1
|
Verfasst: Do 05.05.05 20:56
@j-a-n@gmx.de: Der mySQL-Profiler ist derart schlecht (bis V 4.1), dass er i.d.R. große Abhängigkeiten nicht korrekt auflöst.
Von dem her halte ich es immer so: Genau wissen, was man tut und nicht irgendwas tun und die Datenbank selbst optimieren lassen. Man weiss nie was bei rauskommt.
Und als Ergänzung dazu noch: Paradox hat keinen Profiler.
Viele Grüße,
Matthias
_________________ Ha! Es compiliert! Wir können ausliefern!
|
|