AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Frage zu JOIN

Ein Thema von harfes · begonnen am 26. Jan 2017 · letzter Beitrag vom 27. Jan 2017
Antwort Antwort
Seite 1 von 2  1 2   
harfes

Registriert seit: 25. Jun 2006
Ort: Rand der Scheibe
176 Beiträge
 
Delphi 11 Alexandria
 
#1

Frage zu JOIN

  Alt 26. Jan 2017, 08:11
Datenbank: Firebird • Version: 2.1 • Zugriff über: Delphi/IBDAC
Hallo,

ich habe folgende Abfrage:

with DM1.DataModule1.IBCArtikelQuery do
begin
Close;
SQL.Clear;
SQL.Add('select A.*,E.EINHEIT,W.WARENGRUPPE,L.FIRMA,L.KREDITORENNR ');
SQL.Add('from ARTIKEL A ');
SQL.Add('left outer join EINHEITDB E on A.VERPEINHEIT=E.EID ');
SQL.Add('left outer join EINHEITDB E on A.VERBRAUEINHEIT=E.EID ');
SQL.Add('left outer join EINHEITDB E on A.LAGBESTEINHEIT=E.EID ');
SQL.Add('left outer join EINHEITDB E on A.MINBESTEINHEIT=E.EID ');
SQL.Add('left outer join WARENGRUPPEDB W on A.WARENGRUPPE=W.WID ');
SQL.Add('left outer join LIEFERANT L on A.LIEFERANT1=L.LID ');
ExecSQL;
end;

Diese meldet bei der zweiten (und natürlich den folgenden) "left outer join" folgenden Fehler: "Alias E conflicts with an alias in the same statement". Ok...soweit klar, woher der Fehler kommt. Eine Lösung ist, das E in den weiteren statements durch andere Buchstaben zu ersetzen - aber irgendwie nicht sonderlich elegant.
Hat jemand noch eine andere ("elegantere") Lösung? Insbesondere in Hinsicht auf eine mögliche, zukünftige "Vermehrung" der Einheiten-Felder, wird es irgendwann unübersichtlich...

Hartmut
Hartmut
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Frage zu JOIN

  Alt 26. Jan 2017, 08:34
Wenn du mehrfach einen Join mit einer Tabelle machen möchtest, musst du jedes mal einen anderen Alias benutzen.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Frage zu JOIN

  Alt 26. Jan 2017, 08:37
Ich nummeriere die Aliase nötigenfalls durch, wenn ich dieselbe Tabelle mehrfach hinzujoine (E1, E2, E3 usw.). Aber könnte man in Deinem Fall die Verknüpfungsbedingungen nicht einfach verodern?
left outer join EINHEITDB E on A.VERPEINHEIT=E.EID OR A.VERBRAUEINHEIT=E.EID OR A.LAGBESTEINHEIT=E.EID OR A.MINBESTEINHEIT=E.EID
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
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.874 Beiträge
 
Delphi 12 Athens
 
#4

AW: Frage zu JOIN

  Alt 26. Jan 2017, 08:46
Die Frage ist, was willst Du mit dieser Abfrage erreichen?
Zu jedem Artikel so vorhanden die/den Lieferanten, die Warengruppe(n) ausgeben, soweit so klar.
Aber was soll bei den Einheiten passieren? Auf welche Einheit soll sich Dein E.Einheit beziehen?
Formuliere bitte einmal in Worten, was Du erreichen möchtest und was Dir gegeben ist. Dann läßt sich sicherlich eine mehr oder minder elegante Lösung finden.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
jobo

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

AW: Frage zu JOIN

  Alt 26. Jan 2017, 10:38
.. - aber irgendwie nicht sonderlich elegant.
Hat jemand noch eine andere ("elegantere") Lösung? Insbesondere in Hinsicht auf eine mögliche, zukünftige "Vermehrung" der Einheiten-Felder, wird es irgendwann unübersichtlich...
Wie bereits geschrieben wurde:
Es gibt keine andere Lösung, jeder Alias (sowohl einer Tabelle, als auch eines Feldes) muss eindeutig benannt sein. Es ergibt auch sonst keinen Sinn. Und damit zu Deinem Statement. Stellt man sich vor, in Deinem Statement stünden eindeutige Aliase, was würde es dann für einen Sinn ergeben?
Vielleicht ist Dir die Join-Thematik nicht richtig klar? Oder Du hast ein unglückliches Datenmodell vorliegen?

Aliasnamen
Wenn ich Tabellen mehrfach einbinde, wähle ich den Alias ("entgegen" des Tabellennamens) so, dass er die Menge beschreibt, die ich dort aufbaue bzw. abgreifen will. Dabei stelle ich u.U. auch den praktischen Nutzen eines möglichst kurzen Alias hinten an.
Gruß, Jo
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
294 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Frage zu JOIN

  Alt 26. Jan 2017, 10:50
Hallo,

vielleicht ist es eine gute Idee, das SQL Statement erst einmal im Management Studio der DB aufzubauen, zu testen und wenn alles korrekt ist, das Ding dann nach Delphi zu bringen!

Gruß
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
harfes

Registriert seit: 25. Jun 2006
Ort: Rand der Scheibe
176 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Frage zu JOIN

  Alt 26. Jan 2017, 10:59
Zunächst mal danke für eure Ideen/Anregungen. Wie ich bereits geschrieben habe, ist ein jeweils anderer Alias möglich...aber aus meiner Sicht unschön - und wenn's mehr Einheiten-Felder werden, auch irgendwann mal unübersichtlich.

Um nochmal zu verdeutlichen, warum ich das so mache: in der ARTIKEL-Tabelle habe ich verschiedene Angaben (Anzahl im Lager, Mindestanzahl, Anzahl je Bestelleinheit, etc.), die jeweils mit einer Zahl in einem Feld und mit der zugehörigen Einheit (also Stück, Karton, Rolle, etc.) bzw der ID in einem anderen Feld aus der EINHEITEN-Tabelle (das ist dann der EID) hinterlegt werden. Um beim Anzeigen nicht die ID der Einheit sondern die Einheit im Klartext anzuzeigen, muss ich dass natürlich für jedes Feld auslesen und zuordnen.
Also: ja es geht mit verschiedenen Alias (so habe ich das aktuell auch gelöst), aber ich habe mich eben gefragt, ob es nicht eine elegantere/einfachere/bessere Lösung gibt?

Hartmut
Hartmut
  Mit Zitat antworten Zitat
Jumpy

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

AW: Frage zu JOIN

  Alt 26. Jan 2017, 11:25
Irgendwie wird aber dann doch nicht klar, wenn du die so ggf. ermittelte Einheit nur 1x anzeigst, zu welcher Menge aus den Artikel sie gehört (Lagermenge, Mindestanzahl usw).
Hinzu kommt, dass so ein Artikel mehrfach angezeigt wird, wenn er in mehreren Spalten mit der Einheiten-Tabelle gejoined wird un in mehreren Spalten auch Einträge hat.

So bekäme man nur 1 Datensatz pro Artikel
SQL.Add('select A.*,E1.EINHEIT as Verpackungseinheit,E2.Einheit as Verbrauchseinheit,');//...
SQL.Add('W.WARENGRUPPE,L.FIRMA,L.KREDITORENNR');
SQL.Add('from ARTIKEL A ');
SQL.Add('left outer join EINHEITDB E on A.VERPEINHEIT=E.EID ');
SQL.Add('left outer join EINHEITDB E on A.VERBRAUEINHEIT=E.EID ');
Ralph
  Mit Zitat antworten Zitat
jobo

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

AW: Frage zu JOIN

  Alt 26. Jan 2017, 12:04
Irgendwie wird aber dann doch nicht klar, wenn du die so ggf. ermittelte Einheit nur 1x anzeigst
Genau, daher meine Frage zum Sinn/Verständnis dieses Falles.

Und nochmal, solange mehrfach auf die Einheit referenziert wird, gibt es keine andere Möglichkeit. Zumindest nicht in dieser Darstellungsform. Erst wenn man die Artikel Attribute (alle Einheitsangaben und sonstige) transformiert und in Listenform ausgibt, könnte man mit einem Join verschiedene Einheiten reinjoinen.

Die Transformation der Artikelattribute ist aber dann auch schon ein großer Anlauf. Das wäre ggF. sinnvoll, wenn man es -jenachdem - mit sehr unterschiedlichen Artikeln zu tun hat und deren Attribute standardmäßig als separate Tabelle modelliert.
Ich glaube in diversen Webshops wird das gern mal so gemacht.
Das hat aber wieder eine Gegenindikation, bei der Suche nach Artikeln über verschiedene Attribute.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Frage zu JOIN

  Alt 26. Jan 2017, 12:49
ich lehn mich mal weit aus dem Fenster:
SQL-Code:
select A.*,E.EINHEIT,W.WARENGRUPPE,L.FIRMA,L.KREDITORENNR
from ARTIKEL A
  left outer join EINHEITDB E on A.VERPEINHEIT=E.EID
  left outer join EINHEITDB E on A.VERBRAUEINHEIT=E.EID
  left outer join EINHEITDB E on A.LAGBESTEINHEIT=E.EID
  left outer join EINHEITDB E on A.MINBESTEINHEIT=E.EID
  left outer join WARENGRUPPEDB W on A.WARENGRUPPE=W.WID
  left outer join LIEFERANT L on A.LIEFERANT1=L.LID
das soll bedeuten, gib die gerade aktuelle Mengeneinheit aus (bei Ballen ist Stk null usw.)
Richtig geraten?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:24 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