Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi JOINs (https://www.delphipraxis.net/181557-joins.html)

handson 25. Aug 2014 14:04

Datenbank: MySQL • Version: 5.0.18 • Zugriff über: MicroOLAP DAC

JOINs
 
Hallo!

Ich kämpfe gerade mit einer SELECT-Abfrage und JOINS rum, komme aber auf kein Ergebnis. Vielleicht hat ja jemand eine Idee...

Es betrifft 3 Tabellen, hier der Inhalt:

Tabelle 1:

ArtikelNr, Groesse, Menge
40303, 38, 20
40301, 39, 40

Tabelle 2:

ArtikelNr, Groesse, Menge
40303, 38, 2

Tabelle 3:

ArtikelNr, Groesse, Menge
40301, 39, 1

Es soll geschaut werden, ob die Tabellen 2+3 die Artikel von 1 enthält und diese Mengen als Summen ausgegeben werden.
Ich habe jetzt die Tabelle 1 mit der Tabelle 2 + 3 immer einem INNER JOIN verknüpft, allerdings gibt mir die Datenbank immer nur dann einen Artikel aus der Tabelle 3 aus, wenn die in Tabelle 2 vorhanden ist. Es sollen aber alle Datensätze aus 2+3 ausgegeben werden, da die Artikel auch in
Tabelle 1 enthalten sind.
Ich habe das auch schon mit unterschiedlichen JOINS probiert, ohne Erfolg. Irgendwie muss man der Abfrage beibringen, dass beide JOIN-Tabellen (2+3) gleichberechtigt sind.
Ehrlich gesagt, fehlt mir auch die Beschreibung für das Problem, so dass man mal danach suchen kann...

Vielleicht hat ja jemand eine Idee.
Vielen Dank schon mal im Voraus!

Stephan

DeddyH 25. Aug 2014 14:11

AW: JOINs
 
Ein INNER JOIN gibt nur die Datensätze zurück, die auch in allen beteiligten Tabellen Entsprechungen aufweisen. Du brauchst wohl einen OUTER JOIN, da werden nicht vorhandene Datensätze aus einer der beteiligten Tabellen mit NULL befüllt zurückgegeben.

Neutral General 25. Aug 2014 14:11

AW: JOINs
 
Hallo,

Das sollte eigentlich mit Left-Joins gehen:

Code:
SELECT
  coalesce(tab1.menge, 0) + coalesce(tab2.menge,0) + coalesce(tab3.menge, 0) as menge_summe
FROM tab1
LEFT JOIN tab2 on tab2.artikelnr = tab1.artikelnr
LEFT JOIN tab3 on tab3.artikelnr = tab1.artikelnr
WHERE ...

mkinzler 25. Aug 2014 14:13

AW: JOINs
 
Wenn ich Dich richtig verstanden habe:
SQL-Code:
select
  t1.artikelnummer, t1.groesse, t1.mege as menget1,
  sum( case t2.menge is null, 0, t2.menge) as menget2,
  sum( case t3.menge is null, 0, t3.menge) as menget3
from tablelle1 t1
  full join t2 on t2.artikelnr = t1.artikelnummer
  full join t3 on t3.artikelnr = t1.artikelnummer
group by
  t1.artikelnummer;

Dejan Vu 25. Aug 2014 14:46

AW: JOINs
 
Alternativ könnte man die beiden Artikeltabellen (Tabelle2 und Tabelle3) zu einer Tabelle kombinieren (mit UNION) und dann einen JOIN verwenden
Code:
select * 
  from tabelle1 h
       join (
         select ArtikelNr, Groesse, Menge from tabelle2 
         union
         select ArtikelNr, Groesse, Menge from tabelle3
       ) alleArtikel on h.ArtikelNr = alleArtikel.ArtikelNr
Noch besser wäre es vielleicht, die unschöne Aufteilung in zwei Artikeltabellen über eine View zu verbergen
Code:
create View AlleArtikel as
  select ArtikelNr, Groesse, Menge from tabelle2 
  union
  select ArtikelNr, Groesse, Menge from tabelle3
go

select * 
  from tabelle1 h
       join AlleArtikel a on a.ArtikelNr = h.ArtikelNr
Klar, wenn befürchten muss, das nicht alle Artikel der Tabelle1 in den anderen Tabellen sind, nimmt man 'LEFT JOIN' statt 'JOIN'. Tipp: Einen Dummyartikel 'NULL' anlegen, alle nicht vorhandenen Artikel der Tabelle1 durch NULL ersetzen und dann einen INNER JOIN verwenden. Ist schneller und die referenzielle Integrität ist gewahrt.

handson 26. Aug 2014 08:35

AW: JOINs
 
Hallo!

Das klingt alles schon gut. Ich werde mich mal ransetzen und das alles durchtesten.

Vielen Dank für die schnelle Hilfe. Ich melde mich wieder, wenn's geklappt hat! :-D

Stephan

doctor-x 26. Aug 2014 18:54

AW: JOINs
 
Ich möchte noch hinzufügen, dass man hier nicht "UNION" verwenden sollte, sondern "UNION ALL".
Ein "UNION" wirkt wie ein "DISTINCT" und würde das Ergebnis verfälschen, wenn ein Datensatz in Tabelle 2 genau glich wie in Tabelle 3 ist.

Dejan Vu 26. Aug 2014 20:26

AW: JOINs
 
Kann sein, muss nicht.

Wenn es ein Fehler wäre, in t2 und t3 identische Daten zu haben, ist ein UNION richtig. Im anderen Fall hast Du Recht (wenn t2 und t3 z.B. die Lagerbestände von Lager2 und Lager3 wiederspiegeln). Dann würde aber die View nicht AlleArtikel heißen.

Hmmm. Das Feld 'Menge' hat in einer reinen Artikelliste nichts zu suchen... Also vielleicht doch 'UNION ALL' ;-)

handson 28. Aug 2014 09:40

AW: JOINs
 
Hallo nochmal!

Ich habe mit UNION ALL gemacht, wegen der Menge, und das in einer VIEW gekapselt.
Jetzt funktioniert das auch alles, so wie ich mir das vorgestellt habe.
Vielen Dank nochmal für die schnelle Hilfe!

Stephan


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz