it-swarm.com.de

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

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 "3" falsch zurückgegeben, obwohl ich eine eindeutige ID von 23 benötige.

42
Robinicks

Du kannst tun

SELECT MAX(ID) FROM Customers;
95
notnoop

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.

16
David Andres
SELECT * FROM Customers ORDER BY ID DESC LIMIT 1

Dann holen Sie sich die ID.

10
Joel Enanod Jr
select max(id) from customers
8
deostroll

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

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

8
Brisbe

Wenn Sie von MS SQL sprechen, ist hier der effizienteste Weg. Dadurch wird der aktuelle Identitätsstartwert aus einer Tabelle abgerufen, die auf der Spalte basiert, 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 dauert, um die MAX(id) zu erhalten. IDENT_CURRENT ist fast augenblicklich ...

7
Damon
select max(id) from Customers 
6
monksy

Wenn Sie AUTOINCREMENT verwenden, verwenden Sie: 

SELECT LAST\_INSERT\_ID();

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

Ähnlich behandelt Postgres dies ü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) erfolgt, 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. 

4
Steven Graham

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

E: = πICH WÜRDE (Tabellenname)
E1: = πICH WÜRDEID> = ID ' ((ρICH WÜRDE' E) ⋈ E)) - πICH WÜRDEID <ID “ ((ρICH WÜRDE' E) ⋈ E)) 

Ihre Antwort: Tabellenname ⋈ E1 

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

Für Beziehungsalgebrasymbole siehe: Relationale Algebra Aus Wikipedia

2
Arnab Das

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 der Extraktion 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).

2
paxdiablo

Wenn Sie nur id auswählen möchten, verwenden Sie 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 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.

0
Rachit

Hängt davon ab, welche SQL-Implementierung Sie verwenden. Sowohl MySQL als auch SQLite verfügen beispielsweise über Möglichkeiten, die letzte Einfügungs-ID abzurufen. Wenn Sie PHP verwenden, gibt es sogar eine clevere Funktion für genau diese mysql_insert_id ().

Sie sollten wahrscheinlich versuchen, diese MySQL-Funktion zu verwenden, anstatt sich alle Zeilen anzusehen, um nur die größte Insert-ID zu erhalten. Wenn Ihr Tisch groß wird, könnte dies sehr ineffizient werden.

0
sohum