SQL So aktualisieren Sie nur die erste Zeile

7

Ich arbeite mit PostgreSQL. Ich habe einen Tisch mit einigen Elementen. In der letzten Spalte steht "Y" oder "N". Ich brauche einen Befehl, der nur die erste Übereinstimmung auswählt (ich meine, wo die letzte Spalte 'N' ist) und sie auf 'Y' ändern.

Meine Idee:

%Vor%

Aber es ändert in jeder Reihe "N" in "Y".

    
Lorn 21.01.2014, 12:32
quelle

3 Antworten

13

Hier ist die Abfrage

%Vor%     
Akshay 21.01.2014, 12:35
quelle
19

Warum es nicht funktioniert hat

Andere haben das wie beantwortet, aber Sie müssen wirklich verstehen, warum das falsch war:

%Vor%

SQL evaluiert Schritt für Schritt in einer wohldefinierten Reihenfolge. In diesem Fall wird die Unterabfrage zuerst ausgewertet, weil sie unkorreliert ist , d. H. Sie bezieht sich nicht auf Variablen aus der äußeren Abfrage.

Die Unterabfrage findet die erste Zeile in id order, wobei 'Checked' 'N' ist. Da die SELECT-Liste das Feld Checked enthält, wird die Unterabfrage durch den Wert N ersetzt. Effektiv tut es nichts (außer es könnte NULL statt N sein, wenn keine Zeilen übereinstimmen).

So, jetzt haben Sie:

%Vor%

Beginnen zu sehen, was schief gelaufen ist?

'N' = 'N' wird immer wahr sein. Also ist die WHERE -Klausel immer wahr, und Sie hätten genauso gut eine unbeschränkte Aktualisierung schreiben können.

%Vor%

Wie man es repariert

Sie versuchen, die erste Zeile zu finden, in der checked ist n und checked auf y setzen. Sie müssen diese beiden Teile mithilfe des Primärschlüssels verbinden . Suchen Sie die id , die Sie aktualisieren möchten, und verwenden Sie diese, um die Aktualisierung einzuschränken.

Andere haben den Text dieser Abfrage bereits geschrieben, daher werde ich ihn hier nicht wiederholen. Hoffentlich verstehen Sie jetzt diese Antworten jedoch.

    
Craig Ringer 21.01.2014 12:56
quelle
-2

Beispiel für mssql:

%Vor%

Beispiel für oracle:

%Vor%     
Ulan Ibraev 25.10.2016 12:43
quelle

Tags und Links