Laden...

SQL_Statement Problem mit zuvielen Rückgabewerten

Erstellt von hakbak vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.420 Views
H
hakbak Themenstarter:in
108 Beiträge seit 2007
vor 16 Jahren
SQL_Statement Problem mit zuvielen Rückgabewerten

verwendetes Datenbanksystem: <MS-SQL EXPRESS>

Hallo,
ich komme gerade bei einem SQL Statement nicht weiter, weil mir eine Unterabfrage zuviele Werte zurückgibt. Wie kann man denn sowas anders lösen??

Mein Statement sieht folgendermaßen aus:


SELECT * FROM PRODUCT_PROPERTY WHERE ProductPropSet_ID=(SELECT DISTINCT Property_ID from COMPONENTS where SWOberstufe='"+einagabe+"'')

Das Problem ist, dass eben die Unterabfrage

 SELECT DISTINCT Property_ID from COMPONENTS where SWOberstufe='"+einagabe+"''

4 Werte zurückgibt.

Vielen Dank schonmal

183 Beiträge seit 2006
vor 16 Jahren

Wenn es korrekt ist das diese Abfrage mehrere Werte zurückgeben soll dann bau die Unterabfrage in das IN()-Statement ein, mit IN() kann man eine Liste von Werten übergeben und darauf vergleichen.

Sollte es nicht so sein liegt es an einem schlechten Datenbank-Design 😉

Gut Schuß
VuuRWerK 😉

H
hakbak Themenstarter:in
108 Beiträge seit 2007
vor 16 Jahren

welch ein glück, dass das design NICHT von mir ist!! 🙂

183 Beiträge seit 2006
vor 16 Jahren

Hast Du ein Glück 😉

Aber schon wenn im Statement eine ID abgefragt wird sollte man kein DISTINCT davor setzen müssen, schon allein das ist schlecht 🙂 Eine ID sollte eindeutig sein und wird schon allein durch einen PrimaryKey geschaffen.

So, und nun? Was machste jetzt? Zu allererst trittst Du dem Datenbank-Designer gegens Schienbein 😜

Danach, neu designen, bei Bedarf helfen wir hier vielleicht sogar 🙂

Gut Schuß
VuuRWerK 😉

H
hakbak Themenstarter:in
108 Beiträge seit 2007
vor 16 Jahren

Das mit dem Datenbank Designer gegens Knie treten wird wohl nix, der gehört zu nem Weltkonzern und wird wohl meinen, dass er weiss wasser tu, ich bin nur Diplomand und darf mich mit einer Aufgabe rumschlagen, die keiner machen will ... 🙁

Also ich Design hier garnix 😉

Aber trotzdem Danke mit "in" hat es wunderbar geklappt und ich hab auch das bekommen, was ich wollte 🙂

1.564 Beiträge seit 2007
vor 16 Jahren

Hallo hakbak

Ich würde auf einen JOIN umstellen SQL Server kann die besser verarbeiten als große IN-Blöcke:

SELECT PP.*
   FROM PRODUCT_PROPERTY PP
      JOIN COMPONENTS C ON PP.ProductPropSet_ID = C.Property_ID
   WHERE C.SWOpberstufe = '"+einagabe+"'

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

476 Beiträge seit 2004
vor 16 Jahren

hallo,

dann aber nicht das DISTINCT vergessen... 😄.

Vor allem würde ich '"+einagabe+"' nicht mit String-Verkettung sondern mit Parametern lösen. Das ist nicht nur sicherer da Parameter die Strings entwerten (und so SQL-Injections verhindern) sondern kann durchaus auch schneller sein, denn es ermöglicht dem SQL-Server wiederverwendbare Ausführungspläne zu erstellen, die er dann für die nächste Abfrage noch im Cache hält.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de