AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JOINs

Ein Thema von handson · begonnen am 25. Aug 2014 · letzter Beitrag vom 28. Aug 2014
Antwort Antwort
handson

Registriert seit: 18. Jan 2007
Ort: Delmenhorst
113 Beiträge
 
Delphi 2007 Professional
 
#1

JOINs

  Alt 25. Aug 2014, 15:04
Datenbank: MySQL • Version: 5.0.18 • Zugriff über: MicroOLAP DAC
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
Stephan Faust
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: JOINs

  Alt 25. Aug 2014, 15:11
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: JOINs

  Alt 25. Aug 2014, 15:11
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 ...
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: JOINs

  Alt 25. Aug 2014, 15:13
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;
Markus Kinzler
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: JOINs

  Alt 25. Aug 2014, 15:46
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.
  Mit Zitat antworten Zitat
handson

Registriert seit: 18. Jan 2007
Ort: Delmenhorst
113 Beiträge
 
Delphi 2007 Professional
 
#6

AW: JOINs

  Alt 26. Aug 2014, 09:35
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!

Stephan
Stephan Faust
  Mit Zitat antworten Zitat
doctor-x

Registriert seit: 29. Apr 2007
41 Beiträge
 
#7

AW: JOINs

  Alt 26. Aug 2014, 19:54
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.
Wolf
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: JOINs

  Alt 26. Aug 2014, 21:26
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'
  Mit Zitat antworten Zitat
handson

Registriert seit: 18. Jan 2007
Ort: Delmenhorst
113 Beiträge
 
Delphi 2007 Professional
 
#9

AW: JOINs

  Alt 28. Aug 2014, 10:40
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
Stephan Faust
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 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