Verknüpfungsfehler durch WHERE BEdingung

ACC_Entwickler

Aktiver Benutzer
Beiträge
28
Hallo allerseits,
ich habe folgendes Problem: Ich soll Daten aus mehreren Tabellen auslesen und diese verknüpfen: Das funktioniert bis auf einen Punkt.
Hier mein Code:

SELECT x.WO,
x.Item,
x.[P/N],
x.[S/N],
x.[Part Beschreibung],
x.[Einzel EK],
x.Anzahl,
x.[Einzel VK],
x.[WQ] AS WQ,
x.[Gesamt VK],
x.Split,
x.Fertigstellung

FROM(
SELECT RIGHT(Format(CAST(A.counter AS int), '##-####'), 7) AS WO,
--IIF(B.Nr=W.Item, W.Item,'0') AS Item,
W.Item AS Item,
W.[P/N],
W.[S/N],
--IIF(A.[Rechnungs-Nr] IS NULL,Im.Artikelname,'') AS [Part Beschreibung],
AA.aaName AS [Part Beschreibung],
W.[EK-Preis] AS [Einzel EK],
W.[Anzahl Ausgänge] AS Anzahl,
W.[VK] AS [Einzel VK],
IIF(B.Memo NOT LIKE '%WQ%', NULL, Format(CAST(SUBSTRING(B.[Memo], CHARINDEX('WQ20', B.[Memo]) + 4, 7) AS int), '##-####')) AS WQ,
W.[VK] * W.[Anzahl Ausgänge] AS [Gesamt VK],
W.Nr AS Split,
B.[F-Datum] AS Fertigstellung
FROM SOdata.dbo.Aufträge AS A LEFT JOIN
SOdata.dbo.Beanstandungen AS B ON A.Auftragsnummer = B.Auftragsnummer LEFT JOIN
SOdata.dbo.Warenbuchung AS W ON A.Auftragsnummer = W.Auftragsnummer LEFT JOIN
SOdata.dbo.ArtikelAll AS AA ON W.[P/N] = AA.aaUsePN
WHERE ((A.counter IS NOT NULL) AND
(A.OrderType = 'Auftrag') AND
(CHARINDEX('Auftrag', A.OrderType) = 1)) AND
(CHARINDEX('deleted', A.Auftragnr_neu) = 0 OR (CHARINDEX('deleted', A.Auftragnr_neu) IS NULL)) AND
(B.Nr = W.Item )-- OR W.Item ='0')
)x
WHERE WO = '22-5127'
GROUP BY x.WO,
x.Item,
x.[P/N],
x.[S/N],
x.[Part Beschreibung],
x.[Einzel EK],
x.[Anzahl],
x.[Einzel VK],
x.[Gesamt VK],
x.Fertigstellung,
x.Split,
x.WQ
ORDER BY Item asc

Problem: in der Spalte W.Item gibt es Items mit der Nummer 0, in der Tabelle B.Nr tauchen diese nicht auf. Ich möchte diese Items aber trotzdem anzeigen lassen. Ohne das fett markierte im Code funktioniert die Verknüpfung 1a, bis auf die fehlenden Einträge mit der 0. Allerdings sobald ich die OR W.Item ='0' Clausel mit einbinde fügt er nicht die fehlenden 9 Einträge hinzu sondern fügt stattdessen über 500 Einträge hinzu mit einer 0. Ich glaube das sind dann alle Einträge der gesamten Datenbank, welche mit einer 0 versehen sind und nicht nur die dem Auftrag zugewiesenen.

Meine Frage lautet also, was muss ich in die OR Bedingung noch weiter einbinden, sodass mir nur die Einträge mit 0 zu dem zugehörigen Auftrag bekomme?

Über Anregung und Hilfe freue ich mich und bedanke mich im Vorraus!
MfG
Philipp
 
Zuletzt bearbeitet:
Werbung:
Du musst erstens verstehen, wie And und Or funktionieren und welchen Einfluss dabei die Verwendung von Klammern hat. Deutlicher, was man mit der Verwendung von Klammern erreichen kann.
Du musst zweitens den Unterschied zwischen JOIN und WHERE (Filterung) verstehen und nicht beides vermischen.

Mein Vorschlag dazu wäre, dass Du Dir eine kleine Tabelle machst und es ausprobierst, ganz übersichtlich. Oder ein Tutorial jeweils dazu raussuchst.
 
Du musst erstens verstehen, wie And und Or funktionieren und welchen Einfluss dabei die Verwendung von Klammern hat. Deutlicher, was man mit der Verwendung von Klammern erreichen kann.
Du musst zweitens den Unterschied zwischen JOIN und WHERE (Filterung) verstehen und nicht beides vermischen.

Mein Vorschlag dazu wäre, dass Du Dir eine kleine Tabelle machst und es ausprobierst, ganz übersichtlich. Oder ein Tutorial jeweils dazu raussuchst.
Sorry, wenn das unwissend aussieht, bin kein IT ler und habe mich nur mit learning by doing versucht in sql einzuarbeiten (habe noch nie programmiert)-Notgedrungen, weil der externe Datenbank Besitzer gesagt hat: HAHa ihr seid meine Kunden, aber ne views erstelle ich euch nicht! Wüsste ich weiter, würde ich hier nicht fragen.
Ich habe natürlich dutzende Videos zum Verknüpfen etc gesehen, leider kann ich das aber auf meinen Fall nicht anwenden.

Ich habe mit einer kleinen Tabelle ausprobiert inwieweit die Probleme auftreten... Dabei hat sich herausgestellt, dass sobald ich einen Eintrag aus der B. Tabelle mit hinzunehme die anderen Einträge verfielfacht werden. Wie ich dem nun noch weiter entgegen wirken kann weiß ich leider nicht.
Nach meinem Verständnis verknüpfe ich die Tabellen B und W durch die Spalten Nr bzw Item. Wobei die 0 Einträge, die nur in items vorhandn sind durch die Verwendung von LEFT Join mit übertragen werden sollten. Ich bekomme nun ohne Where Bedingung aber ein Kreuzprodukt mit nicht 272 Spalten sondern 7888. Ergo habe ich die Where bedingung gesetzt W.Item = B.Nr dabei kommt das korrekte Ergebnis, ohne die 0 Einträge heraus. Es sind 263 spalten ohne die 9 Spalten mit den 0 Einträgen. Sage ich nun OR W.Item =0 ist nach meinem Verständnis alles vorherige gültig und ich ergänze meine Filterung auf die Einträge mit 0. Das ist aber scheinbar nicht der Fall weil ich wenn ich das mache 524 Spalten bekomme von denen 261 Spalten mit dem Eintrag Item = 0 ist. Klammern habe ich in jeder Variation schon gesetzt und probiert- hat nichts gebracht . Wenn du mir meinen Fehler in der Logik erklären kannst wäre ich dir echt dankbar!
 
Sorry, wenn das unwissend aussieht, bin kein IT ler
Darum geht es überhaupt nicht, das Forum ist für alle da, die Fragen haben.

Bei Dir fehlen offenbar viele Grundlagen und wenn Du in langen Texten Dein Problem beschreibst, ist das weniger hilfreich, als Du vermutlich glaubst. Die meisten Mitforisten inkl. mir sind keine Maschinen und die Komplexität eines Problems übersteigt schnell meine Kopfrechenfähigkeiten. Oder anders, trotz langer Erklärungen könnte man dutzende Rückfragen stellen, um die Situation zu klären, das ist unpraktikabel, nervig, zeitintensiv, missverständlich und wird so dann für beide Seiten frustrierend oder sogar ärgerlich.

Wir kommt man also zusammen?
Man beschreibt sein Problem beispielhaft in Form eines Table Create Statements, einiger Insert Befehle und eines möglichen, vielleicht falschen Selectstatements, das den Lösungsversich darstellt.

Wenn Du also
Ich habe mit einer kleinen Tabelle ausprobiert inwieweit die Probleme auftreten... Dabei hat sich herausgestellt
sowas bereits gemacht hast, poste genau das hier und alle Rückfragen erübrigen sich.
Das Table Create Statement beschreibt haargenau, wie das Modell aussieht.
Die Inserts für die Beispieldaten zeigen Deine Problemstellung.
Das Selectstatement selbst sagt mehr, als eine Beschreibung des Select Statements.

Es könnte durch eine Umschreibung eines Wunschergebnis oder die explizite Darstellung des Wunschergebnis präzisiert werden.
 
Darum geht es überhaupt nicht, das Forum ist für alle da, die Fragen haben.

Bei Dir fehlen offenbar viele Grundlagen und wenn Du in langen Texten Dein Problem beschreibst, ist das weniger hilfreich, als Du vermutlich glaubst. Die meisten Mitforisten inkl. mir sind keine Maschinen und die Komplexität eines Problems übersteigt schnell meine Kopfrechenfähigkeiten. Oder anders, trotz langer Erklärungen könnte man dutzende Rückfragen stellen, um die Situation zu klären, das ist unpraktikabel, nervig, zeitintensiv, missverständlich und wird so dann für beide Seiten frustrierend oder sogar ärgerlich.

Wir kommt man also zusammen?
Man beschreibt sein Problem beispielhaft in Form eines Table Create Statements, einiger Insert Befehle und eines möglichen, vielleicht falschen Selectstatements, das den Lösungsversich darstellt.

Wenn Du also

sowas bereits gemacht hast, poste genau das hier und alle Rückfragen erübrigen sich.
Das Table Create Statement beschreibt haargenau, wie das Modell aussieht.
Die Inserts für die Beispieldaten zeigen Deine Problemstellung.
Das Selectstatement selbst sagt mehr, als eine Beschreibung des Select Statements.

Es könnte durch eine Umschreibung eines Wunschergebnis oder die explizite Darstellung des Wunschergebnis präzisiert werden.
Im Anhang die Tabellen!
Ich Würde gerne die Tabelle mit richtiger Verknüpfung haben, jedoch zusätzliche Einträge aus der W.Item Spalte die 0 (Nicht NULL) sind. Mit meiner Or klausel funktioniert es wie gesagt nicht. Die Where Bedingung muss meines erachtens nach erweitert werden. Aber es kann auch sein, dass ich auf dem Holzpfad bin.

Code:

SELECT x.WO,
x.Item,
x.Split,
x.Fertigstellung
FROM(
SELECT RIGHT(Format(CAST(A.counter AS int), '##-####'), 7) AS WO,
W.Item AS Item,
W.Nr AS Split,
B.[F-Datum] AS Fertigstellung
FROM SOdata.dbo.Aufträge AS A INNER JOIN
SOdata.dbo.Warenbuchung AS W ON A.Auftragsnummer = W.Auftragsnummer INNER JOIN
SOdata.dbo.Beanstandungen AS B ON A.Auftragsnummer = B.Auftragsnummer LEFT JOIN
SOdata.dbo.Warenbuchung ON B.Nr = W.Item
WHERE ((A.counter IS NOT NULL) AND
(A.OrderType = 'Auftrag') AND
(CHARINDEX('Auftrag', A.OrderType) = 1)) AND
(CHARINDEX('deleted', A.Auftragnr_neu) = 0 OR (CHARINDEX('deleted', A.Auftragnr_neu) IS NULL)) --AND
--(W.Item = B.Nr) --OR (W.Item ='0'))
)x
WHERE WO = '22-5127'
GROUP BY x.WO,
x.Item,
x.Split,
x.Fertigstellung

ORDER BY Item asc


Ich hoffe dass es das Problem so einfach genug darstellt.
MfG
Philipp
 

Anhänge

  • Beispieltabelle mit fehlerhafter Verknüpfung.PNG
    Beispieltabelle mit fehlerhafter Verknüpfung.PNG
    69,2 KB · Aufrufe: 8
  • Beispieltabelle mit JOIN ohne WHERE Bed..PNG
    Beispieltabelle mit JOIN ohne WHERE Bed..PNG
    71 KB · Aufrufe: 8
  • Beispieltabelle mit richtiger verknüpfung ohne Items =0.PNG
    Beispieltabelle mit richtiger verknüpfung ohne Items =0.PNG
    68,8 KB · Aufrufe: 8
Ich gehe davon aus, dass du dich lieber schnippisch über mich lustig machst, anstatt mir zu helfen. Das lese ich zumindest daraus...
hast Du schon mal versucht, ein Bild mit SQL-Befehlen drauf neben Deinen SQL-Server zu legen und zu hoffen, der liest das ein? Ja? Erfolgreich?
Mehr als Bilder und Code kann ich nicht zur Verfügung stellen... Ich habe selbst nur Lesezugriff auf die Datenbank deshalb kann ich auch keine Tabellen erstellen.
 
Mehr als Bilder und Code kann ich nicht zur Verfügung stellen... Ich habe selbst nur Lesezugriff auf die Datenbank deshalb kann ich auch keine Tabellen erstellen.
Tja, das gleiche gilt mindestens für alle Helfer! Ich habe nicht mal lesenden Zugriff auf Deine DB.
Hier ist ein Beispiel, wie man es machen kann:
Es behandelt die Outer Join Problematik, die Dir in die Hacken läuft. Naja, es stellt den Effekt da. Verstehst Du das Beispiel und was da passiert?
 
ich verstehe leider nicht, was du meinst.
Die Sache ist vielleicht zu einfach, um drauf zu kommen.
Hier ist da Konzept eines Progammierforums:
- Du kopierst oder schreibst Scripte und postest sie hier
- Die Helfer kopieren Deine geposteten Scripte, testen sie, entdecken den Fehler und posten eine Korrektur ode Hinweise, welche Änderungsmöglichkeiten es gibt.

In Kurz:
Das Posten von Screenshots inkludiert nicht nicht Möglichkeit für den Helfer, die Problemstellung per Copy / Paste (also bequem und schnell, ohne Abtippen und Tippfehler selbst durchzuführen und zu testen)

länger:
Das Posten von Screenshots inkludiert ebenfalls nicht die Möglichkeit, dass der TE (hier Du) sich allein schon durch Nachstellung des Problems mit dem Problemkern selbst auseinandersetzt (und dabei ggF. sogar schon die Lösung findet- soll vorkommen munkelt man).
 
I
ich habe meinen Code doch extra komplett reinkopiert.
Komplett? Dann habe ich etwas übersehen, Table Create oder Daten sind mir nicht aufgefallen.

Die Online Plattform ist nur ein Beispiel, das ist Luxus. Du kannst Create Script, Insert Statements, Select Statements, falsche Ergebnisse, Fehlermeldungen alle einfach hier reinkopieren, als Text.
Auf dieser Onlineplattform kann ich gar nicht MS SQL auswählen.
Doch, "SQL Server" ist eine gängige Bezeichnung / "Abkürzung" für Microsoft SQL Server. Er wird auf dieser Online Plattform sogar für viele verschiedene Versionen angeboten. Vermutlich ist er (der Hersteller spezifische Server) für die Probleme, die Du hast noch nicht mal entscheidenend. Weil Deine Probleme sehr grundlegender Natur sind und auf jedem Server gleichermaßen auftreten.
 
Werbung:
Tja, das gleiche gilt mindestens für alle Helfer! Ich habe nicht mal lesenden Zugriff auf Deine DB.
Hier ist ein Beispiel, wie man es machen kann:
Es behandelt die Outer Join Problematik, die Dir in die Hacken läuft. Naja, es stellt den Effekt da. Verstehst Du das Beispiel und was da passiert?
Ich verstehe das inhaltlich! mitd er Syntax habe ich mich nicht beschäftigt,
I

Komplett? Dann habe ich etwas übersehen, Table Create oder Daten sind mir nicht aufgefallen.

Die Online Plattform ist nur ein Beispiel, das ist Luxus. Du kannst Create Script, Insert Statements, Select Statements, falsche Ergebnisse, Fehlermeldungen alle einfach hier reinkopieren, als Text.

Doch, "SQL Server" ist eine gängige Bezeichnung / "Abkürzung" für Microsoft SQL Server. Er wird auf dieser Online Plattform sogar für viele verschiedene Versionen angeboten. Vermutlich ist er (der Hersteller spezifische Server) für die Probleme, die Du hast noch nicht mal entscheidenend. Weil Deine Probleme sehr grundlegender Natur sind und auf jedem Server gleichermaßen auftreten.
okay, danke für die Info, dann versuche ich den code da jetzt reinzukloppen und eben eine Datenbank mitd em Schema anzulegen. Danke für die Einführung.
 
Zurück
Oben