Hierarchische Abfrage mit Marker

nosmot

Benutzer
Beiträge
5
Hallo, ich hoffe, dass ich hier richtig bin. Ist mein erster Beitrag. Ich beschäftige mich neuerdings mit SQL und brauche Hilfe. Da ich gute Erfahrungen mit dem SAP-Board vom DV-Treff gemacht habe, erhoffe ich mir Selbiges nun hier.

Hier mein Problem: Ich habe in der Tabelle STückListe_gesamt alle Zuordnungen von Stücklisten. Nun möchte ich die Stücklisten finden, die gestern geändert wurden, und mir alle Ober_STL dazu anzeigen lassen, in denen die geänderten STL vorkommen. Bis dahin funktioniert der Code.

Nun soll unser BI-System jedem Konstrukteur eine Mail schicken, wo Änderungen auf eine Ober_STL treffen, die gerade in der Produktion in einem Auftrag verwendet wird. Auf dem Pfad durch die Hierarchie geht mir jedoch der Wert Geändert_von verloren. Der Name hängt nur am Eingangsdatensatz. Den Namen desjenigen, der die STL geändert hat, müsste ich also von Beginn an mitschleppen und an jede Hierarchiestufe mit anheften.

Und das bekomme ich nicht hin. Für Tipps bin ich dankbar.
...............

DECLARE @yesterday AS DATE = GETDATE()-1;

WITH Hierarchie AS (

SELECT
Ober_STL,
Geänderte_STL,
Änderungsdatum,
Geändert_von

FROM STL_gesamt
WHERE Änderungsdatum = @yesterday

UNION ALL

SELECT
e.Ober_STL,
e.Geänderte_STL,
e.Änderungsdatum,
e.Geändert_von

FROM Hierarchie inner join STL_gesamt e on
Hierarchie.Ober_STL = e.Geänderte_STL
)
SELECT Ober_STL, Änderungsdatum, Geändert_von
FROM Hierarchie
 
Werbung:
FROM Hierarchie inner join STL_gesamt e on
Hierarchie.Ober_STL = e.Geänderte_STL
Hier selektierst Du aus 'stl_gesamt' und aus der hierarchischen CTE, die Du 'hierarchie' genannt hast.

SELECT
e.Ober_STL,
e.Geänderte_STL,
e.Änderungsdatum,
e.Geändert_von
Hier definierst Du die Ergebnisspalten. die sind alle aus 'e' (stl_gesamt), keine aus 'hierarchie'.

Spendier der 'hierarchie' noch einen Alias, sagen wir 'h' und nimm die Spalte h.geändert_von mit in die Ausgabe.

Das mal so auf die Schnelle.
Den gleichlautenden Spaltennamen musst Du natürlich mit einem Spaltenalias versehen oder die Spalte aus 'e' weglassen.

Code:
SELECT
    e.Ober_STL,
    e.Geänderte_STL,
    e.Änderungsdatum,
    e.Geändert_von,
    h.Geändert_von as Geändert_von_h
 
Danke. Aber etwas mache ich noch falsch. Im Original sieht das so aus, Geändert_von = AENAM.
e.AENAM habe ich weggelassen. Scheinbar kann ich da aber nicht einfach ein h.AENAM draus machen.

Bin Anfänger, sorry.

DECLARE @yesterday AS DATE = GETDATE()-1;

WITH hierarchie AS (

SELECT MATNR, IDNRK, AEDAT, AENAM
FROM [Board].[core].[STPO_STAS_STKO]
WHERE AEDAT = @yesterday

UNION ALL

SELECT e.MATNR, e.IDNRK, e.AEDAT, h.AENAM
FROM hierarchie inner join [Board].[core].[STPO_STAS_STKO] e on
hierarchie.MATNR = e.IDNRK
)
SELECT MATNR, AEDAT, AENAM
FROM hierarchie
WHERE IDNRK like'000000004%'
 

Anhänge

  • 2024-06-26_131648.jpg
    2024-06-26_131648.jpg
    101,6 KB · Aufrufe: 2
Hmmm. ChatGPT sagt:

SELECT e.MATNR, e.IDNRK, e.AEDAT, h.AENAM
FROM hierarchie h inner join [Board].[core].[STPO_STAS_STKO] e on h.MATNR = e.IDNRK

Zumindest ist der Fehler weg und es gibt eine Ausgabe. Muss mal sehen ob das passt, und dann versuchen den geänderten Code zu verstehen :-)
 
Werbung:
Gut

Das
SELECT e.MATNR, e.IDNRK, e.AEDAT, h.AENAM
FROM hierarchie h inner join ..
kannst Du nur machen, wenn Du den Table Alias h auch festlegst, einfach indem Du ihn hinter die Tabelle/Datenquelle schreibst, für die er stehen soll. Das hat chatgpt richtig gemacht und Du hast es in Deinem Versuch ausgelassen. Du hast einen Alias verwendet, aber nicht definiert.
Table Aliase kannst Du angeben, musst Du aber nicht. Solange ein Feldname eindeutig ist, wird er richtig zugeordnet. Daraus folgt dass gerade bei der mehrfachen Verwendung der selben Datenquelle ein Table Alias definiert werden muss. So ist es ja in dem Statement auch mit dem Abschnitt
join [Board].[core].[STPO_STAS_STKO] e
bereits gemacht worden.

Da Deine Query eine Recursive CTE bildet und sie hierarchie nennt, kannst Du auch den CTE Namen anstelle des Alias verwenden (hast Du aber nicht). Dem CTE Namen in der FROM Clause trotzdem noch einen Alias zu spendieren, ist also nicht zwingend notwendig, es ist einfach dann analog(einheitlich) zur anderen Tabelle in der FROM Clause gemacht und ein Buchstabe als Alias ist weniger Schreibarbeit. Das erhöht sofort die Bereitschaft, den Alias auch immer brav zu nutzen (denn das muss ja nicht zwangsläufig geschehen). Aber auch das, die zwanglose Nutzung eines Alias, ist hilfreich, weil sie dokumentiert, aus welcher Tabelle eine Spalte stammt. Das wiederum ist nicht nur, aber auch, hilfreich in einem Forum wie hier, wo im Zweifel niemand die Spalten in den Tabellen nachschlagen kann außer Dir.

Aber etwas mache ich noch falsch.
"Etwas" wird meistens in der Fehlermeldung genannt, mal mehr, mal weniger treffend.
Es ist immer hilfreich, die Fehlermeldung zu posten. Dann muss man weniger raten und kann erstmal lesen. Nur so für nächstes Mal.
 
Zurück
Oben