![]() |
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 |
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.
|
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 ... |
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; |
AW: JOINs
Alternativ könnte man die beiden Artikeltabellen (Tabelle2 und Tabelle3) zu einer Tabelle kombinieren (mit UNION) und dann einen JOIN verwenden
Code:
Noch besser wäre es vielleicht, die unschöne Aufteilung in zwei Artikeltabellen über eine View zu verbergen
select *
from tabelle1 h join ( select ArtikelNr, Groesse, Menge from tabelle2 union select ArtikelNr, Groesse, Menge from tabelle3 ) alleArtikel on h.ArtikelNr = alleArtikel.ArtikelNr
Code:
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.
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 |
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 |
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. |
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' ;-) |
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 23:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz