MSSQL: Warum funktioniert update mit diesen bedingungne aber delete nicht?
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 schreiben
Antwort 1 von Marie vom 08.08.2019, 12:31 Options
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 vom 08.08.2019, 12:39 Options
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 vom 08.08.2019, 12:44 Options
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 vom 08.08.2019, 12:53 Options
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 vom 08.08.2019, 13:08 Options
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 vom 08.08.2019, 13:27 Options
die ands brauchst du nicht gesondert zu klammern da "and vor or"