SQL-How zu Aktualisieren, wird nur die erste Zeile
Arbeite ich mit PostgreSQL.
Ich habe Tabelle mit einigen Elementen. In der letzten Spalte gibt, ist 'Y' oder 'N' Brief. Ich brauche den Befehl, die Wählen Sie nur die erste, die passen (ich meine, wo die Letzte Spalte 'N') und ändern Sie es auf "Y".
Meine Idee:
UPDATE Table SET Checked='Y'
WHERE (SELECT Checked FROM Table WHERE Checked='N' ORDER BY ID LIMIT 1) = 'N'
Aber es ändert 'N' zu 'Y' in jeder Zeile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die Abfrage
, Warum es nicht funktioniert hat
Andere beantwortet haben wie, aber Sie wirklich brauchen, um zu verstehen warum das war falsch:
SQL wertet Schritt für Schritt in einer definierten Reihenfolge. In diesem Fall wird die Unterabfrage ausgewertet, Erstens, weil es unkorrelierte, d.h. es bezieht sich nicht auf Variablen aus der äußeren Abfrage.
Der Unterabfrage findet die erste Zeile in
id
um, wo 'Überprüft' wird 'N', und wie die SELECT-Liste enthält das FeldChecked
bedeutet, dass die Unterabfrage ersetzt werden für den WertN
. Effektiv tut es nichts (außer, dass es sein könnteNULL
stattN
wenn keine Zeilen überein).So, jetzt haben Sie:
Beginnen, um zu sehen, was falsch gelaufen ist?
'N' = 'N'
ist immer wahr. Also dieWHERE
- Klausel immer wahr ist, und Sie könnte, wie auch schon geschrieben ein uneingeschränktes aktualisieren., Wie es zu beheben
Du bist versuchen zu finden, die erste Zeile, wo
checked
istn
- und set -checked
zuy
. Sie müssen verbinden diese beiden Teile mit dem Primärschlüssel. Finden Sie dieid
Sie aktualisieren möchten, dann verwenden, um fixieren Sie das update.Andere schon geschrieben haben, den text der Abfrage, so dass ich es hier nicht wiederholen werde. Ich hoffe, Sie verstehen jetzt die Antworten, obwohl.
Erwähnen, dass wenn man die gleichzeitigen Anfragen, die Sie behandeln müssen, mit Transaktionen, zum Beispiel -
wenn Sie möchten, überspringen gesperrte Zeilen
Beispiel für mssql:
Beispiel von oracle: