Rückgabe basierend auf spezifischer Werte einer Zeile

5habr

Neuer Benutzer
Beiträge
3
Hallo

Ich habe folgendes Problem:
Ich möchte basierend auf einer Zeile alle Zeilen zurück geben, die dieselbe Kommissioniernummer und dieselbe Ausliefernummer haben.

Ich habe es folgendermassen probiert:
select distinct Kommnr, Reihenfolge, kind, Artikel,artikelhistory.ausliefernummer from Kommissionieraufträge
left join artikelhistory on Kommissionieraufträge.ziel_sscc = artikelhistory.sscc
WHERE Kommnr IN (
SELECT Kommnr
FROM Kommissionieraufträge
WHERE kind = 'FINISH'
)
AND artikelhistory.ausliefernummer IS NOT NULL
AND KIND NOT IN ('DEPOSIT','PRINT','SUSPENDED')
order by Kommnr, Reihenfolge

Mein Ergebnis sieht folgendermassen aus:
Kommnr Reihenfolge kind Artikel artikelhistory.ausliefernummer
123456 1 PICK 6132533 1234685
123456 2 PICK 6132537 1234685

123456 3 PICK 6466541 1234680
123456 4 PICK 3152769 1234679
123456 5 PICK 3590538 1234685
123456 6 PICK 6439331 1234680
123456 7 PICK 6524490 1234679
123456 8 PICK 7044891 1234685
123456 9 PICK 3120066 1234685

123456 10 PICK 4390177 1234679
123456 11 PICK 5935748 1234685
123456 12 PICK 6378899 1234680
123456 13 PICK 7096249 1234685
123456 14 PICK 7024844 1234685
123456 15 FINISH null 1234685


Ich möchte aber nur die Zeilen bei denen auch die Ausliefernummer gleich ist. Da ich diese über einen left join erhalte, kann ich nicht in der Unterabfrage direkt mit dieser ausschliessen sondern benutze im Moment die Kommnr.

Wie müsste ich meine Abfrage anpassen?
 
Werbung:
Die Unterabfrage ist bei dir ein Filterkriterium kein Join.
Du kannst ja auch über mehrere Felder joinen. Sonst hilft dir vielleicht die Funktion "Exists".
Da kannst du mehrere Filter Kriterien verknüpfen.
 
Du suchst möglicherweise das hier:
Code:
SELECT    ka.Kommnr,
        ka.Reihenfolge,
        ka.kind,
        ka.Artikel,
        ah.ausliefernummer
FROM    Kommissionieraufträge ka
LEFT JOIN artikelhistory ah
ON        ka.ziel_sscc = ah.sscc
WHERE EXISTS (
    SELECT    1
    FROM    Kommissionieraufträge
    INNER JOIN artikelhistory
    ON        Kommissionieraufträge.ziel_sscc = artikelhistory.sscc
    WHERE    Kommissionieraufträge.Kommnr = ka.Kommnr
    AND        Kommissionieraufträge.kind = 'FINISH'
    AND        artikelhistory.ausliefernummer = ah.ausliefernummer )
AND        ah.ausliefernummer IS NOT NULL
AND        ka.kind NOT IN ( 'DEPOSIT','PRINT','SUSPENDED' )
ORDER BY ka.Kommnr,ka.Reihenfolge
Da die Auslieferungsnummer nur in artikelhostory steht musste ich das jetzt im Select bei EXISTS auch noch mal joinen, das ist nicht optimal aber liefert möglicherweise erstmal das gesuchte Ergebnis.
 
Die zwei Tabellennamen und die Bennenung der Spalten ist in meiner Frage ersichtlich
Ja, es ist ersichtlich, was ersichtlich ist. Ein SQL Statement ohne die durchgängige Verwendung von Table Alias verrät aber die Spaltenherkunft nur, wenn der volle Tabellenname angegeben ist. Hier nicht der Fall.
Existierende Feldnamen, die im Statement nicht genutzt werden, verrät das Statement natürlich gar nicht. Hier der Fall.
Wenn Du also nach Hilfe fragst, warum postest Du nicht das Datenmodell mit FK Relationen?
"Weil es doch beschrieben ist..."? Falls Du das antworten möchtest würde ich entgegnen, nichts ist so klar und eindeutig wie ein DDL Statement einer Tabelle. Es wäre also sogar effizienter, es zu posten, statt vieler, blumiger Worte. (Es gibt natürlich auch sehr bescheidene Tabellendefinitionen, denen man die FK nicht entnehmen kann. Trotzdem hätte der bereitwillige Helfer immer noch alle Namen und Spaltentypen)

Zu Deinem Left-Join Problem
Du kannst ein Where Kriterium in den Join verschieben. Damit bleibt dessen Charakter erhalten (left) und die Wirkung ist dennoch wie ein Filter.
 
Guten Morgen

Besten Dank für Eure schnelle Hilfe, ich versuche in den nächsten Tagen mein Problem zu lösen und falls ich weitere Hilfe benötige, werde ich mich melden.

@dabadepdu Ich werde es mir zu Herzen nehmen und versuchen in Zukunft allfällige Fragen besser zu stellen. Ich bin da eher ein Neuling und brauche es nur um Reportings zu erstellen - und hab teilweise den Überblick auch noch nicht über 100+ Tabellen

Schönes Wochenende allen
 
Zu Deinem Left-Join Problem
Du kannst ein Where Kriterium in den Join verschieben. Damit bleibt dessen Charakter erhalten (left) und die Wirkung ist dennoch wie ein Filter.
Filter in Bezug auf die gejointe Tabelle. Ein WHERE-Kriterium das sich auf die Ausgangstabelle bezieht kannst du natürlich nicht einfach verschieben, dann wäre das Ergebnis anders.
 
Werbung:
Filter in Bezug auf die gejointe Tabelle. Ein WHERE-Kriterium das sich auf die Ausgangstabelle bezieht kannst du natürlich nicht einfach verschieben, dann wäre das Ergebnis anders.
Natürlich in Bezug auf die gejointeN Tabellen (zwei) oder aber auch einen Ausdruck, der nur eine oder gar keine der beiden Tabellen einbezieht.
Die "Ausgangstabelle" eines Joins ist was? Man würde im ..join..on keine Tabelle ansprechen, die nicht zum Join gehört. Die Ausgangstabelle wäre also meinetwegen die linke (left join)?
Und klar kann ich das Where Kriterium (oder Teile davon) dieser Ausgangstabelle in den Join verschieben, ebenso das der anderen anderen Jointabelle. Und das Ergebnis wird sich verändern, ja, zumindest bei Outer Joins. Das war ja genau mein Tipp.

Es wird häufig der Fehler gemacht, nach einem Outer Join in der Where Clause auf einen Ausdruck zu filtern, ohne zu berücksichtigen, dass man damit im Endergebnis alle leeren Outer Results (NULL) rausfiltert. Man zerstört damit den Charakter des Outer Joins. Dies lässt sich verhindern, wenn man solche Filter in den Join verschiebt.
Ich hatte den Eindruck, das sei hier mindestens ein Teil des Problems.
und hab teilweise den Überblick auch noch nicht über 100+ Tabellen
Den haben wir noch weniger :) Es sind ja Deine Tabellen.
Es ist wirklich sehr hilfreich, sich an der Stelle wenigstens den Teil der relevanten Tabellen genau anzuschauen und auch mit zu posten. Im Idealfall merkst Du bei der Erstellung des Threads bereits, was eigentlich das Problem ist und lernst vielleicht sogar mehr dabei.
 
Zurück
Oben