Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

SQL Abfrage funktioniert nicht mehr nach Update

Frage Entwicklung Datenbanken

Mitglied: Cocktailz82

Cocktailz82 (Level 1) - Jetzt verbinden

18.12.2013 um 12:38 Uhr, 1851 Aufrufe, 5 Kommentare

Hallo zusammen,

nach unserem letzten Update der Datenbank (Sage auf MS SQL Server 2008) läuft eine SQL Abfrage nicht mehr.

Die Abfrage komplett ist wie folgt:

01.
 
02.
SELECT     dbo.KHKArtikel.Artikelnummer, dbo.KHKArtikelgruppen.Bezeichnung AS Gruppe, dbo.KHKArtikel.Bezeichnung1 AS Bez1,  
03.
                      dbo.KHKArtikel.Bezeichnung2 AS Bez2, dbo.KHKArtikelVarianten.Lagerbestand AS Bestand, dbo.KHKArtikelVarianten.MittlererEK AS MEK, 
04.
                          (SELECT     KHKPreislistenArtikel.Einzelpreis 
05.
                            FROM          KHKPreislistenArtikel, KHKPreislisten 
06.
                            WHERE      KHKPreislistenArtikel.ListeID = KHKPreislisten.ID AND KHKPreislisten.Bezeichnung = 'Haendler' AND  
07.
                                                   KHKArtikel.Artikelnummer = KHKPreislistenArtikel.Artikelnummer) AS Haendler, 
08.
                          (SELECT     KHKPreislistenArtikel.Einzelpreis 
09.
                            FROM          KHKPreislistenArtikel, KHKPreislisten 
10.
                            WHERE      KHKPreislistenArtikel.ListeID = KHKPreislisten.ID AND KHKPreislisten.Bezeichnung = 'Endkunde' AND  
11.
                                                   KHKArtikel.Artikelnummer = KHKPreislistenArtikel.Artikelnummer) AS Endkunde, dbo.KHKArtikel.Dispoformel AS Dispo,  
12.
                      dbo.KHKArtikel.USER_WebPromotion AS Highlight, dbo.KHKArtikelBezeichnung.Langtext AS Langtext 
13.
FROM         dbo.KHKArtikel INNER JOIN 
14.
                      dbo.KHKArtikelgruppen ON dbo.KHKArtikel.Artikelgruppe = dbo.KHKArtikelgruppen.Artikelgruppe LEFT OUTER JOIN 
15.
                      dbo.KHKArtikelBezeichnung ON dbo.KHKArtikel.Artikelnummer = dbo.KHKArtikelBezeichnung.Artikelnummer LEFT OUTER JOIN 
16.
                      dbo.KHKArtikelVarianten ON dbo.KHKArtikel.Artikelnummer = dbo.KHKArtikelVarianten.Artikelnummer 
17.
WHERE     (dbo.KHKArtikelVarianten.Lagerbestand > 0) OR 
18.
                      (dbo.KHKArtikel.Dispoformel = 11) 
19.
 
Vorher lief diese Formel super und hat auch immer genau einen Wert zu einer Artikelnummer herausgeworfen. Wenn man nun die Unterabfragen ( Codezeilen 4 - 11)
rausnimmt funktioniert das ganze zwar, allerdings dann ohne die Preise. Beim versuch das ganze neu aufzubauen hängt das ganze dann daran, das man nur Artikel angezeigt bekommt, ohne Lagerbestand, oder mit dem Filter auf Lagerbestand > 0 garnichts mehr angezeigt bekommt.

Die Fehlermeldung die man derzeit bekommt lautet:

Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf .....

Ich verweifel hier grad ein wenig an dem Ding. Ich hab schon öfter mal ein wenig mit SQL gearbeitet, aber die Unterabfragen und die Ergebnisse die ich in den letzten 1,5 Tagen mit dieser Herausforderung hab, sind mir doch noch etwas zu viel.

Gibt es hier ein paar versierte SQL Spezis die mir hier ein wenig zur Hand gehen können?
Bin über jede hilfe froh und dankbar!!


Gruß Tailz
Mitglied: LianenSchwinger
18.12.2013 um 13:35 Uhr
Hallo Tailz,

ich bin ja kein Freund von solchen Unterabfragen im SELECT-Teil.

Warum bindest Du diese nicht per LEFT JOIN mit ein?

01.
LEFT JOIN (SELECT KHKPreislistenArtikel.Artikelnummer AS Artkelnummer, KHKPreislistenArtikel.Einzelpreis AS Einzelpreis 
02.
           FROM KHKPreislistenArtikel, KHKPreislisten  
03.
           WHERE KHKPreislistenArtikel.ListeID = KHKPreislisten.ID AND KHKPreislisten.Bezeichnung = 'Haendler') a  
04.
     ON KHKArtikel.Artikelnummer = a.Artikelnummer 
05.
 
06.
LEFT JOIN (SELECT KHKPreislistenArtikel.Artikelnummer AS Artkelnummer, KHKPreislistenArtikel.Einzelpreis AS Einzelpreis 
07.
           FROM KHKPreislistenArtikel, KHKPreislisten  
08.
           WHERE KHKPreislistenArtikel.ListeID = KHKPreislisten.ID AND KHKPreislisten.Bezeichnung = 'Endkunde') b   
09.
     ON KHKArtikel.Artikelnummer = b.Artikelnummer
Und im SELECT-Teil a.einzelpreis AS Haendler und b.einzelpreis AS Endkunde.

G Jörg
Bitte warten ..
Mitglied: Cocktailz82
18.12.2013 um 13:44 Uhr
Hi Jörg,

Ich bin auch kein Freund von solchen Unterabfragen. Hab das leider so von meinem Vorgänger alles übernommen und mich bislang auch ehrlicherweise nich groß drum gekümmert.

Werd ich mal durchtesten. Danke schonmal für den Tipp.
Bitte warten ..
Mitglied: MadMax
18.12.2013, aktualisiert um 13:50 Uhr
Hallo Tailz,

in mindestens einer Deiner beiden Unterabfragen für die Preise bekommst Du mehrere Zeilen zurück und das ist an dieser Stelle nicht zulässig.

Umgehen kannst Du das, indem Du ein " top (1) " hinter das SELECT in der Unterabfrage schreibst. Dann bringt die Unterabfrage sicher nur eine Zeile zurück und funktioniert:
01.
                          (SELECT     top (1) KHKPreislistenArtikel.Einzelpreis 
02.
                            FROM          KHKPreislistenArtikel, KHKPreislisten 
03.
                            WHERE      KHKPreislistenArtikel.ListeID = KHKPreislisten.ID AND KHKPreislisten.Bezeichnung = 'Haendler' AND KHKArtikel.Artikelnummer = KHKPreislistenArtikel.Artikelnummer) AS Haendler,
Aber wenn es zu einem Artikel mehrere Händler oder mehrere Kunden gibt, dann ist das Ergebnis mit Sicherheit unbefriedigend, weil Du eben zufällig einen Händler und zufällig einen Kunden angezeigt bekommst. Den Zufall könntest Du mit einem "ORDER BY" noch beeinflussen, damit wenigstens immer derselbe Preis gewählt wird:
01.
                          (SELECT     top (1) KHKPreislistenArtikel.Einzelpreis 
02.
                            FROM          KHKPreislistenArtikel, KHKPreislisten 
03.
                            WHERE      KHKPreislistenArtikel.ListeID = KHKPreislisten.ID AND KHKPreislisten.Bezeichnung = 'Haendler' AND KHKArtikel.Artikelnummer = KHKPreislistenArtikel.Artikelnummer 
04.
                             ORDER BY KHKPreislisten.ID) AS Haendler,
Du soltest Dir also überlegen, was der Zweck hinter Deiner Abfrage ist. Möchtest Du den höchsten/niedrigesten oder vielleicht den Durchschnittspreis angezeigt bekommen? Dann sollte die Unterabfrage eine Aggregatfunktion enthalten. Dann brauchst Du das "top (1)" nicht, dann kommt auch nur ein Datensatz zurück. Wäre dann etwa so:
01.
                          (SELECT     max (KHKPreislistenArtikel.Einzelpreis) 
02.
                            FROM          KHKPreislistenArtikel, KHKPreislisten 
03.
                            WHERE      KHKPreislistenArtikel.ListeID = KHKPreislisten.ID AND KHKPreislisten.Bezeichnung = 'Haendler' AND KHKArtikel.Artikelnummer = KHKPreislistenArtikel.Artikelnummer) AS Haendler,
Und letzten Endes kannst Du auch alle möglichen Kombinationen von Händler- und Kundenpreisen erzeugen:
01.
SELECT     dbo.KHKArtikel.Artikelnummer, dbo.KHKArtikelgruppen.Bezeichnung AS Gruppe, dbo.KHKArtikel.Bezeichnung1 AS Bez1,  
02.
                      dbo.KHKArtikel.Bezeichnung2 AS Bez2, dbo.KHKArtikelVarianten.Lagerbestand AS Bestand, dbo.KHKArtikelVarianten.MittlererEK AS MEK, 
03.
                          HaendlerTab.Einzelpreis AS Haendler, 
04.
                          EndkundeTab.Einzelpreis AS Endkunde, 
05.
                          dbo.KHKArtikel.Dispoformel AS Dispo,  
06.
                      dbo.KHKArtikel.USER_WebPromotion AS Highlight, dbo.KHKArtikelBezeichnung.Langtext AS Langtext 
07.
FROM         dbo.KHKArtikel INNER JOIN 
08.
                      dbo.KHKArtikelgruppen ON dbo.KHKArtikel.Artikelgruppe = dbo.KHKArtikelgruppen.Artikelgruppe LEFT OUTER JOIN 
09.
                      dbo.KHKArtikelBezeichnung ON dbo.KHKArtikel.Artikelnummer = dbo.KHKArtikelBezeichnung.Artikelnummer LEFT OUTER JOIN 
10.
                      dbo.KHKArtikelVarianten ON dbo.KHKArtikel.Artikelnummer = dbo.KHKArtikelVarianten.Artikelnummer 
11.
                      outer apply (SELECT     KHKPreislistenArtikel.Einzelpreis 
12.
                            FROM          KHKPreislistenArtikel, KHKPreislisten 
13.
                            WHERE      KHKPreislistenArtikel.ListeID = KHKPreislisten.ID AND KHKPreislisten.Bezeichnung = 'Haendler' AND KHKArtikel.Artikelnummer = KHKPreislistenArtikel.Artikelnummer) AS HaendlerTab 
14.
                      outer apply (SELECT     KHKPreislistenArtikel.Einzelpreis 
15.
                            FROM          KHKPreislistenArtikel, KHKPreislisten 
16.
                            WHERE      KHKPreislistenArtikel.ListeID = KHKPreislisten.ID AND KHKPreislisten.Bezeichnung = 'Endkunde' AND KHKArtikel.Artikelnummer = KHKPreislistenArtikel.Artikelnummer) AS EndkundeTab 
17.
WHERE     (dbo.KHKArtikelVarianten.Lagerbestand > 0) OR 
18.
                      (dbo.KHKArtikel.Dispoformel = 11)
Wobei dann sicher noch die Namen des Händlers und des Kunden interessant wären.

Gruß, Mad Max

Edit: Die letzte Möglichkeit ist quasi dasselbe wie vom Tarzan. Aber vorsicht, da bekommst Du ein Kreuzprodukt, das mußt Du Dir überlegen, ob Du das willst.
Bitte warten ..
Mitglied: Cocktailz82
18.12.2013, aktualisiert 19.12.2013
Hi,

dein Tipp war Gold wert Jörg! Hat mir richtig weiter geholfen. Vielen Dank schonmal
Funktioniert allerdings noch nicht ganz so wie erhofft.

Die Abfrage liefert jetzt auf jedenfall schonmal die Artikel mit Bestand und dazu den Händler und den Endkundenpreis.
Allerdings liefert sie mir immer 32 mal den selben Datensatz zurück. Und das merkwürdigste Phänomen ist: Wenn ich dann eine Sortierung nach Artikelnummer hinzufüge,
werden aus den 32 Datensätzen plötzlich nur noch 16. Ich wird hier noch verrückt. Ich würd gern verstehen warum ich mal 32 DS bekomme und dann wiederum nur 16 durch eine SORTIERUNG, die ja meines Erachtens nach garnicht in der Lage sein kann zu filtern. Ist mir irgendwie zu hoch

Das war in der alten nicht so. Hab nun versucht das ganze per

01.
Group by KHKArtikel.Artikelnummer
zu verhindern und somit zu jeder Artikelnummer nur einen DS zu bekommen, aber da bekomm ich dann nur Fehlermeldungen.
Hast du dazu evtl. auch noch eine Idee?

Gruß
Bitte warten ..
Mitglied: Cocktailz82
18.12.2013 um 14:38 Uhr
Hi Mad Max,

da haste ja mal ordentlich einen rausgehauen. Nicht Schlecht! Der Zweck ist eigetnlich ein ganz ganz simpler: Ich möchte zu den Artikel von denen grad ein Lagerbestand vorhanden ist, den Preis für die Endkunden und den Preis für die Händler auslesen. Anfangs hab ich gedacht das kann ja nicht so kompliziert sein, und dann sah ich die Datenbankstruktur.

Werd mich hier auch noch mal durcharbeiten

Gruß und Danke

Jens
Bitte warten ..
Ähnliche Inhalte
Datenbanken
SQL Abfrage Update nach Vergleich
gelöst Frage von gigi300885Datenbanken3 Kommentare

Hallo zusammen, ich habe folgendes Problem und leider nicht wirklich eine Idee dazu: Es sind zwei Tabellen die verglichen ...

Datenbanken
SQL-Abfrage mit "kleiner gleich" funktioniert nicht
gelöst Frage von derSESODatenbanken2 Kommentare

Hallo! Per folgender SQL-Abfrage erhalten wir nicht das korrekte Ergebnis: Dabei wird die letzte Bedingung "<=" nicht korrekt umgesetzt. ...

PHP
Abfrage SQL
gelöst Frage von dudeldoedelPHP3 Kommentare

Hallo zusammen, kann man das in einer SQL Abfrage erreichen ??? Feldwert lautet: {"565":{"textinput":{"comment":"1400"}}} als Ergebnis soll ausgelesen werden ...

Datenbanken
Hilfe bei SQL Abfrage
gelöst Frage von e51bomagDatenbanken9 Kommentare

Habe einfach eine Denkblockade und würde mich über Hilfe bei einer Datenbankabfrage freuen. Die Abfrage lautet wie folgt: SELECT ...

Neue Wissensbeiträge
Windows 10

Windows 10 Hello-Anmeldung per Foto ausgehebelt

Tipp von kgborn vor 1 StundeWindows 10

Windows Hello ist eine Funktion, um sich per Fingerabdruck-, Gesichts- oder Iriserkennung bei Windows 10-Geräten anzumelden (siehe), setzt aber ...

Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 8 StundenPerl2 Kommentare

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 9 StundenSicherheit1 Kommentar

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 1012 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Heiß diskutierte Inhalte
Windows Server
SCCM 2016: PXE Boot des Clients schlägt fehl
Frage von gabeBUWindows Server22 Kommentare

Hallo Zusammen Ich habe eine Testumgebung erstellt um über SCCM 2016 einen virtuellen Client aufzusetzen. Folgende Maschinen habe ich ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
gelöst Frage von CenuzeNetzwerkgrundlagen19 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Windows Server
Logging von "gesendeten Nachrichten" auf Terminalservern
gelöst Frage von Z3R0C0MM4N0THiN6Windows Server10 Kommentare

Hallo zusammen, kann mir jemand auf kurzem Wege sagen ob 1) die per Task-Manager (oder damals tsadmin) an Benutzer ...