![]() |
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:
(Original-Abfrage ist ein bißchen komplizierter...)
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) 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:
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.
union
select ArtikelNr, 0, Bestand from LBestand 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 |
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) |
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. |
AW: union auf eine Spalte
Wie sieht die Beziehung der 3. Tabelle zu den beiden anderen aus?
|
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 |
AW: union auf eine Spalte
Mein Problem war, dass mir Ergebnisse fehlten, wenn keine Kundenbedarf vorhanden, aber Lagerbestand.
Zitat:
Zitat:
Zitat:
Zitat:
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 06:48 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 by Thomas Breitkreuz