AGB  ·  Datenschutz  ·  Impressum  







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

union auf eine Spalte

Ein Thema von Ykcim · begonnen am 21. Mär 2019 · letzter Beitrag vom 21. Mär 2019
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#1

union auf eine Spalte

  Alt 21. Mär 2019, 13:07
Datenbank: MySQL • Version: 5 • Zugriff über: UniDac
Hallo Zusammen,
ich habe eine große Abfrage, in der ich:
ArtikelNr-----Kundbedarf-----Lagerbestand abfrage.
Dabei sind Kundenbedarf und Lagerbstand in zwei unterschiedlichen Tabellen.
Delphi-Quellcode:
select k.ArtikelNr, l.Bestand from KdBedarf k
left join LBestand l on l.ArtikelNr=k.ArtikelNr
where k.Lieferdatum<Date_Add(now(), interval 1000 day)
(Original-Abfrage ist ein bißchen komplizierter...)
Das klappt auch wunderbar.
Jetzt gibt es aber Fälle, bei denen es keinen Kundenbedarf gibt, aber Lagerbestand. Diese Fälle möchte ich auch in dem Ergbenis haben.

Daher wollte ich mit einem UNION arbeiten, denn die where-Bedingung mit dem Lieferdatum schließt alle Datensätze ohne Kundenbedarf aus...
Delphi-Quellcode:
union
select ArtikelNr, 0, Bestand from LBestand
Das klappt auch. Allerdings bekomme ich durch die zweite Abfrage alle Artikel und ihren Lagerbestand angezeigt, und die , die auch einen Kundenbedarf haben jetzt doppelt.
Mit einem Group by kann ich nicht arbeiten, denn die ArtikelNr kommen bei den Kundenbedarfen mehr als einmal vor...

Gibt es eine Möglichkeit, ein UNION auf eine Spalte zu begrenzen?
Wenn ich das richtig verstanden habe, dann eliminiert UNION nur die Datensätze, die alle Felder identisch haben. Gibt es eine Möglichkeit, um Datensätze beim UNION zu unterbinden, wenn die ArtikelNr schon vorhanden ist?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

AW: union auf eine Spalte

  Alt 21. Mär 2019, 13:22
Sowas in der Art:
SQL-Code:
select k.ArtikelNr, l.Bestand from KdBedarf k
left join LBestand l on l.ArtikelNr = k.ArtikelNr
where k.Lieferdatum < Date_Add(now(), interval 1000 day)
union
select ArtikelNr, 0 as Bestand from LBestand z
where not exists (select 1 from KdBedarf x where z.ArtikelNr = x.ArtikelNr)

Geändert von Delphi.Narium (21. Mär 2019 um 13:32 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: union auf eine Spalte

  Alt 21. Mär 2019, 13:26
Also ich habe ehrlich gesagt nicht ganz verstanden, wofür Du bei dem gezeigten Statement beide Quellen brauchst (inhaltlich).

Wieso nimmst Du nicht alles aus dem Bestand und bei vorhandenen Kundenanfragen diese dazu? (Was auch immer davon benötigt wird)

Union ist für Deine Zwecke nicht geeignet. Es wird allgemein für das aneinanderfügen von Daten aus unterschiedlichen Quellen verwendet. Und es eliminiert nur "beiläufig", weil es kein "union all" ist.

Wenn Du aus den gleichen Tabellen Daten mit verschiedenen Kriterien abfragen möchtest, dann nimmst Du eine OR Verknüpfung in die WHERE Clause auf.
Gruß, Jo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: union auf eine Spalte

  Alt 21. Mär 2019, 13:27
Wie sieht die Beziehung der 3. Tabelle zu den beiden anderen aus?
Markus Kinzler
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: union auf eine Spalte

  Alt 21. Mär 2019, 13:42
Man könnte auch einen anderen (Full Outer?) Join nehmen oder in der Bedingung sowas ala:
where k.Lieferdatum<Date_Add(now(), interval 1000 day) or k.Lieferdatum is null .

Dann müsste man aber auch statt k.ArtikelNr sinngemäß schreiben if k.ArtikelNr is null then l.ArtikelNr else k.ArtikelNr end
Ralph
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: union auf eine Spalte

  Alt 21. Mär 2019, 14:26
Mein Problem war, dass mir Ergebnisse fehlten, wenn keine Kundenbedarf vorhanden, aber Lagerbestand.

Zitat:
where k.Lieferdatum<Date_Add(now(), interval 1000 day) or k.Lieferdatum is null .
So etwas hatte ich schon getestet, aber leider ohne Erfolg.

Zitat:
Wieso nimmst Du nicht alles aus dem Bestand und bei vorhandenen Kundenanfragen diese dazu? (Was auch immer davon benötigt wird)
In der Tabelle mit den Kundenbedarfen sind sehr viel mehr Datensätze, weil es viele Bedarfe eines Artikels zu unterschiedlichen Zeiten gibt. Leider habe ich kein Kriterium für ein Group by in den Kundenbedarfen...

Zitat:
Wie sieht die Beziehung der 3. Tabelle zu den beiden anderen aus?
Ich habe an dieser Stelle nur nur zwei Tabellen... KdBedarf und LBestand. Im UNION habe ich noch einmal den LBestand gesamt abgefragt...

Zitat:
where not exists (select 1 from KdBedarf x where z.ArtikelNr = x.ArtikelNr)
Das werde ich wohl nochmal ausprobieren, ist aber sehr ähnlich dem, was ich bereits probiert habe.

Aktuell bin ich das Problem umgangen. Die Daten werden in einer Function verarbeitet und die habe ich so gebaut, dass die doppelten Einträgen nicht stören.

Vielen Dank!!!
Patrick
Patrick
  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 00:11 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