Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   union auf eine Spalte (https://www.delphipraxis.net/200113-union-auf-eine-spalte.html)

Ykcim 21. Mär 2019 12:07

Datenbank: MySQL • Version: 5 • Zugriff über: UniDac

union auf eine Spalte
 
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

Delphi.Narium 21. Mär 2019 12:22

AW: union auf eine Spalte
 
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)

jobo 21. Mär 2019 12:26

AW: union auf eine Spalte
 
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.

mkinzler 21. Mär 2019 12:27

AW: union auf eine Spalte
 
Wie sieht die Beziehung der 3. Tabelle zu den beiden anderen aus?

Jumpy 21. Mär 2019 12:42

AW: union auf eine Spalte
 
Man könnte auch einen anderen (Full Outer?) Join nehmen oder in der Bedingung sowas ala:
SQL-Code:
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

Ykcim 21. Mär 2019 13:26

AW: union auf eine Spalte
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 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