Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

MSSQL: Warum funktioniert update mit diesen bedingungne aber delete nicht?





Frage

Nutze MSSQL 2005 Manager übers Netzwerk auf einen MSSQL 2000 Server. Ich habe diese Konstrukte: 1. SELECT * FROM dbo.vw_xy WHERE (xy_nr IN (12345, 54321)) AND (xy_ab > 100) AND (xy_ab < 131) OR (xy_ab > 200) AND (xy_ab < 210) OR (xy_ab > 300) AND (xy_ab < 310) OR (xy_ab > 400) AND (xy_ab < 409) ORDER BY xy_ab alles was ich haben will wird angezeigt, mehr nicht. 2. UPDATE dbo.vw_xy SET xy_st = 'G', xy_me = 0, xy_in = 0 WHERE (xy_nr IN (12345, 54321)) AND (xy_ab > 100) AND (xy_ab < 150) OR (xy_ab > 200) AND (xy_ab < 250) OR (xy_ab > 300) AND (xy_ab < 350) OR (xy_ab > 400) AND (xy_ab < 450) alle Updates laufen durch, ich kann dann die Infos extrahieren. 3. DELETE FROM dbo.vw_xy WHERE (xy_nr IN (12345, 54321)) AND (xy_ab > 100) AND (xy_ab < 150) OR (xy_ab > 200) AND (xy_ab < 250) OR (xy_ab > 300) AND (xy_ab < 350) OR (xy_ab > 400) AND (xy_ab < 450) er löscht mir die zeilen mit den nummern im bereich von xy_ab (101 -149), so wie gewollt ABER dann alle zeilen der restlichen bereich. Was habe ich falsch gemacht?

Antwort 1 von Marie

Zitat:
ABER dann alle zeilen der restlichen bereich.


soll bitte was heissen???

Was soll gelöscht werden und was wird gelöscht???

Gruß Marie

Antwort 2 von mrt181

er löscht die zeilen mit den werten 12345 und 54321 im bereich zwischen 100 bis 150


WHERE (xy_nr IN (12345, 54321)) 
AND (xy_ab > 100) AND (xy_ab < 150)


Das funktioniert. Dann soll er auch aus diesen Bereichen die Werte löschen

OR (xy_ab > 200) AND (xy_ab < 250) 
OR (xy_ab > 300) AND (xy_ab < 350) 
OR (xy_ab > 400) AND (xy_ab < 450)


Er löscht aber in diesen Bereichen alle Zeilen, d.h. in der Tabelle gibt es anschließend diese Bereiche nicht mehr.

Antwort 3 von mrt181

Zitat:
Dann soll er auch aus diesen Bereichen die Werte löschen


sollte heißen:

Dann soll er auch aus diesen Bereichen die Zeilen mit den Werten löschen

Antwort 4 von Proggi

wenn die 12345/54321 bedingung auch für die bereiche 200, 300 und 400 gelten soll müstest du klammern setzen:

WHERE xy_nr IN (12345, 54321) AND
(xy_ab > 100 AND xy_ab < 150
OR xy_ab > 200 AND xy_ab < 250
OR xy_ab > 300 AND xy_ab < 350
OR xy_ab > 400 AND xy_ab < 450)


ich habe diese "in" anweisung noch nicht praktisch verwendet, könnte mir vorstellen das da auch etwas nicht hinhaut.

Lasse dir auch mal echo mysql_error(); ausgeben eventuell läuft die delete-anweisung während des löschens auf einen logischen Fehler (ich vermute eben wegen der IN-Anweisung wenn Werte fehlen wo er vielleicht mit vergleichen möchte o.ä.)

Antwort 5 von mrt181

Komisch nur das es bei SELECT und UPDATE funktioniert.

echo mysql_error() steht mir bei microsoft nicht zur Verfügung. Ich werde es mal mit einklammern versuchen, dann ungefähr so:

DELETE FROM dbo.vw_xy
WHERE (xy_nr IN (12345, 54321))
AND ((xy_ab > 100 AND xy_ab < 150) 
OR (xy_ab > 200 AND xy_ab < 250) 
OR (xy_ab > 300 AND xy_ab < 350) 
OR (xy_ab > 400 AND xy_ab < 450))


Die where bedingung beinhalte za 30 Einträge, deswegen habe ich es mit
WHERE spalte IN ('wert_1','wert_2',...,'wert_n')

gemacht statt
WHERE spalte=wert_1 OR spalte=wert_2 OR ... OR spalte=wert_n

Das Beispiel habe ich verkürzt.

Antwort 6 von Proggi

die ands brauchst du nicht gesondert zu klammern da "and vor or"