Statistik zu BSASTL

Anfragen und Lösungen, die per SQL-Script zu lösen sind und von Anwendern entwickelt oder von Dienstleistern zur Verfügung gestellt wurden

Moderator: SYNERPY

Antworten
T3N
Beiträge: 6
Registriert: Mo Mai 11, 2009 11:59 am

Statistik zu BSASTL

Beitrag von T3N » Di Okt 26, 2010 11:25 am

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

informatikus
Beiträge: 20
Registriert: Do Okt 08, 2009 9:26 pm
Wohnort: Immenstadt

Beitrag von informatikus » Di Okt 26, 2010 8:50 pm

Hallo T3N,

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' 
Schönen Gruß
"Vertrauen Sie mir. Ich weiß, was ich tue!" - Sledge Hammer

admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin » Mi Okt 27, 2010 8:12 am

Einerseits fehlt noch die Einschränkung auf Variante 1

WHERE ergänzen um

Code: Alles auswählen

AND BSAS.MASKENKEY = '         1'
andererseits würde ich immer Aliasse verwenden:

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' 

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:

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

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.

Antworten