Hallo Forum,
ich komme mit einer SQL Abfrage nicht weiter und vielleicht kann mir jemand dazu einen Tip geben.
Aufgabenstellung:
Auflistung aller Stücklistenpositionen aus einer Stückliste der Variante 1 eines bestimmten Artikels (über BSA.MASKENKEY definiert)
(die folgende Abfrage ist nur ein Grundgerüst, um meine Problematik zu zeigen)
SELECT BSASTL.MASKENKEY,
BSASTL.BSA_ID_ARTNR,
BSA.MASKENKEY,
BSA.ARTBEZ,
BSA.ARTBEZ2,
BSAS.BSA_ID_LINKKEY
FROM BSASTL
LEFT OUTER JOIN BSAS ON BSASTL.BSAS_ID_LINKKEY = BSAS.ID
LEFT OUTER JOIN BSA ON BSASTL.BSA_ID_ARTNR = BSA.ID
WHERE BSAS.BSA_ID_LINKKEY = 5462
In der WHERE-Abfrage möchte ich an sich den dazugehörigen BSA.MASKENKEY und nicht den BSAS.BSA_ID_LINKKEY (im aktuellen Beispiel 5462) beim Start der Statistik manuell eingeben können.
Wenn ich das aber zum Bespiel mit:
WHERE BSA.MASKENKEY = 'SYS-S8005C/HE'
mache, dann schränke ich dabei die SELECT-Anweisung vom Anfang ein.
Die Bedingung WHERE BSA.MASKENKEY = 'SYS-S8005C/HE' darf sich nur auf die Verbindung der BSAS.BSA_ID_LINKKEY auf die BSA.ID beziehen. Aber ich weiss nicht, wie sich das realisieren lässt.
Danke für die Hilfe!
t3n
Statistik zu BSASTL
Moderator: SYNERPY
-
- Beiträge: 20
- Registriert: Do Okt 08, 2009 9:26 pm
- Wohnort: Immenstadt
Hallo T3N,
einfach mit Ihrer Bedingung ein zweites Mal mit dem Artikelstamm verknüpfen:
Schönen Gruß
einfach mit Ihrer Bedingung ein zweites Mal mit dem Artikelstamm verknüpfen:
Code: Alles auswählen
SELECT BSASTL.MASKENKEY,
BSASTL.BSA_ID_ARTNR,
BSA1.MASKENKEY,
BSA1.ARTBEZ,
BSA1.ARTBEZ2,
BSAS.BSA_ID_LINKKEY,
bsa2.maskenkey
FROM BSASTL
LEFT OUTER JOIN BSAS ON BSASTL.BSAS_ID_LINKKEY = BSAS.ID
LEFT OUTER JOIN BSA BSA1 ON BSASTL.BSA_ID_ARTNR = BSA1.ID
LEFT OUTER JOIN BSA BSA2 ON BSAS.BSA_ID_LINKKEY = BSA2.ID
WHERE BSA2.MASKENKEY = 'SYS-S8005C/HE'
"Vertrauen Sie mir. Ich weiß, was ich tue!" - Sledge Hammer
-
- Site Admin
- Beiträge: 2673
- Registriert: Di Feb 10, 2004 5:48 am
- Wohnort: Bayreuth
Einerseits fehlt noch die Einschränkung auf Variante 1
WHERE ergänzen um
andererseits würde ich immer Aliasse verwenden:
Und noch als Anmerkung: Der Abfragebefehl ist nicht sehr optimal (daher langsam), da für die Abfrage der Haupttabelle kein Index verwendet wird. In unserer Testdatenbank macht er circa 1 Mio Lesezugriffe auf Tabellen und die Abfrage dauert 4,5 Sekunden.
So dauert es nur ganz wenige Millisekunden:
Aber vorsicht, nicht jedes SELECT kann so umgeschrieben werden. Voraussetzung hier ist, dass alle Tabellen immer Daten über die Verbindung bringen. Ein NULL als Rückgabewert, wie bei einem LEFT OUTER JOIN, wenn eine Tabelle leer ist bzw. keine entsprechenden Datensätze hat, kann es nicht geben.
WHERE ergänzen um
Code: Alles auswählen
AND BSAS.MASKENKEY = ' 1'
Code: Alles auswählen
SELECT A.MASKENKEY,
A.BSA_ID_ARTNR,
C.MASKENKEY,
C.ARTBEZ,
C.ARTBEZ2,
B.BSA_ID_LINKKEY,
D.maskenkey
FROM BSASTL A
LEFT OUTER JOIN BSAS B ON A.BSAS_ID_LINKKEY = B.ID
LEFT OUTER JOIN BSA C ON A.BSA_ID_ARTNR = C.ID
LEFT OUTER JOIN BSA D ON B.BSA_ID_LINKKEY = D.ID
WHERE D.MASKENKEY = 'SYS-S8005C/HE'
So dauert es nur ganz wenige Millisekunden:
Code: Alles auswählen
SELECT A.MASKENKEY,
A.BSA_ID_ARTNR,
C.MASKENKEY,
C.ARTBEZ,
C.ARTBEZ2,
B.BSA_ID_LINKKEY,
D.maskenkey
FROM BSASTL A, BSAS B, BSA C, BSA D
WHERE D.MASKENKEY = 'SYS-S8005C/HE' AND
A.BSAS_ID_LINKKEY = B.ID AND
A.BSA_ID_ARTNR = C.ID AND
B.BSA_ID_LINKKEY = D.ID