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.
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
Das funktioniert. Dann soll er auch aus diesen Bereichen die Werte löschen
Er löscht aber in diesen Bereichen alle Zeilen, d.h. in der Tabelle gibt es anschließend diese Bereiche nicht mehr.
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
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.ä.)
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:
Die where bedingung beinhalte za 30 Einträge, deswegen habe ich es mit
gemacht statt
Das Beispiel habe ich verkürzt.
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"