zeile SQL-Wie finde ich die höchste Zahl in einer Spalte?




sql zeile mit maximalwert (12)

Nehmen wir an, ich habe die folgenden Daten in der Customers-Tabelle: (mehr nicht)

ID   FirstName   LastName
-------------------------------
20   John        Mackenzie
21   Ted         Green
22   Marcy       Nate

Mit welcher SELECT-Anweisung kann ich die Nummer 22 in der ID-Spalte erhalten?

Ich muss so etwas tun, um eine eindeutige ID zu generieren. Sicher, ich kann das System über Auto-Inkrement ausführen lassen, aber wie bekomme ich dann die automatisch generierte ID?

Ich dachte an "SELECT ID FROM Customers" und an das Zählen der zurückgegebenen Zeilen. Dies scheint jedoch schrecklich ineffektiv zu sein. In diesem Fall wird fälschlicherweise "3" zurückgegeben, obwohl ich eine eindeutige ID von 23 benötige.


Du kannst tun

SELECT MAX(ID) FROM Customers;

select * from tablename order by ID DESC

das wird dir eine Reihe mit ID 22 geben


Wenn Sie gerade einen Datensatz in die Customers-Tabelle eingefügt haben und den Wert des Felds mit der zuletzt ausgefüllten ID benötigen, können Sie die Funktion SCOPE_IDENTITY verwenden. Dies ist nur nützlich, wenn INSERT im selben Bereich wie der Aufruf von SCOPE_IDENTITY stattgefunden hat.

INSERT INTO Customers(ID, FirstName, LastName)
Values
(23, 'Bob', 'Smith')

SET @mostRecentId = SCOPE_IDENTITY()

Dies kann für Sie nützlich sein oder nicht, aber es ist eine gute Technik, die Sie beachten sollten. Es funktioniert auch mit automatisch generierten Spalten.


Wenn Sie nur die id select max(id) from customer möchten, wählen select max(id) from customer .

Wenn Sie die gesamte Zeile auswählen möchten, verwenden Sie eine Abfrage wie folgt:

select c1.*
from customer c1, (select max(id) as max_id from customer )c2 
where c1.id=c2.max_id

c2 ist ein Alias ​​für die neue temporäre Tabelle, die die max id enthält. Dann wird das Kreuzprodukt mit der Kundentabelle aufgenommen, um die gesamte Reihe zu erhalten.

Hier schreiben wir eine Abfrage in der from-Klausel, die oft sehr nützlich sein kann.


Um es jederzeit zu erhalten, können Sie SELECT MAX(Id) FROM Customers .

In der Prozedur, in der Sie es hinzufügen, können Sie jedoch auch SCOPE_IDENTITY , um die von dieser Prozedur zuletzt hinzugefügte SCOPE_IDENTITY zu erhalten.
Dies ist sicherer, da Sie Ihre ID - nur dann erhalten, wenn andere gleichzeitig zur Datenbank hinzugefügt werden.


select max(id) from Customers 

SELECT * FROM Customers ORDER BY ID DESC LIMIT 1

Dann holen Sie sich die ID.


In PHP:

$sql = mysql_query("select id from customers order by id desc");
$rs = mysql_fetch_array($sql);
if ( !$rs ) { $newid = 1; } else { $newid = $rs[newid]+1; }

$newid = 23 wenn der letzte Datensatz in Spalte ID 22 war.


Sie können auch relationale Algebra verwenden. Eine etwas langwierige Prozedur, aber hier ist nur zu verstehen, wie MAX () funktioniert:

E: = π ID (Tabellenname)
E1: = π IDID> = ID ' ((ρ ID' E) ID E)) - π IDID <ID ' ((ρ ID' E) ⋈ E))

Ihre Antwort: Tabellenname ⋈ E1

Grundsätzlich subtrahieren Sie den Satz der geordneten Relation (a, b), in der a < b von A ist, wobei a, b ∈ A ist.

Für Beziehungsalgebrasymbole siehe: Relationale Algebra Von Wikipedia


Wenn Sie von MS SQL sprechen, ist hier der effizienteste Weg. Dadurch wird der aktuelle Identitätsstartwert aus einer Tabelle abgerufen, basierend auf der Spalte, die die Identität ist.

select IDENT_CURRENT('TableName') as LastIdentity

Die Verwendung von MAX(id) ist generischer, aber zum Beispiel habe ich eine Tabelle mit 400 Millionen Zeilen, die 2 Minuten braucht, um den MAX(id) . IDENT_CURRENT ist fast augenblicklich ...


Wenn Sie keine automatisch inkrementierenden Felder verwenden, können Sie ein ähnliches Ergebnis wie folgt erzielen:

insert into Customers (ID, FirstName, LastName)
    select max(ID)+1, 'Barack', 'Obama' from Customers;

Dadurch wird sichergestellt, dass keine Wettlaufsituation besteht, die von einer anderen Person verursacht werden könnte, die zwischen dem Extrahieren der maximalen ID und dem Einfügen des neuen Datensatzes in die Tabelle eingefügt wurde.

Dies ist die Verwendung von Standard-SQL. Es gibt zweifellos bessere Möglichkeiten, dies mit bestimmten DBMS zu erreichen, aber sie sind nicht unbedingt portabel (etwas, das wir in unserem Shop sehr ernst nehmen).


Wenn Sie AUTOINCREMENT , verwenden Sie:

SELECT LAST\_INSERT\_ID();

Angenommen, Sie verwenden MySQL: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

Postgres behandelt dies ähnlich über die Funktion currval(sequence_name) .

Beachten Sie, dass die Verwendung von MAX(ID) nicht sicher ist, es sei denn, Sie sperren die Tabelle, da es (in einem vereinfachten Fall) möglich ist, eine weitere Einfügung vorzunehmen, die vor dem Aufruf von MAX(ID) und Sie die ID der ersten Einfügung verlieren. Die oben genannten Funktionen sind sitzungsbasiert. Wenn Sie also eine weitere Sitzung einfügen, erhalten Sie immer noch die von Ihnen eingegebene ID.





sql-server