2009-10-10 24 views
34

Digamos que tengo los datos siguientes en la tabla Clientes: (nada más)SQL - ¿Cómo encontrar el número más alto en una columna?

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

¿Qué tipo de instrucción SELECT puede conseguirme el número 22, en la columna ID?

Necesito hacer algo como esto para generar una identificación única. Claro que puedo dejar que el sistema haga esto mediante el incremento automático, pero ¿cómo obtendré el ID generado automáticamente?

pensé en "SELECT ID de clientes" y contando las filas devueltas pero esto parece terriblemente ineficiente y en este caso, va a devolver incorrectamente "3", a pesar de que necesito una identificación única de 23.

+3

Sin faltar el respeto a msaeed, pero Brisbe42 + D Las respuestas ávidas de Andrés son mejores. –

+0

Gran punto, pero sus respuestas no responden directamente a mi pregunta. Mi método es más seguro de todos modos ya que obtengo una identificación gratis y luego agrego un registro. Por supuesto, podría decirse que las operaciones simultáneas podrían estropear esto con múltiples programas que obtienen la misma identificación "gratuita" y reutilizarla ... pero esto se puede evitar agregando un registro súper rápido después de obtener una identificación gratuita. –

+0

msaeed y algunos otros antes de su pregunta * exactamente *. La pregunta es "SQL: ¿cómo encontrar el número más alto en una columna?" y "¿Qué tipo de declaración SELECT puede obtener el número 22, en la columna ID?".Corrija su publicación para aclarar sus intenciones. – Liao

Respuesta

78

Usted puede hacer

SELECT MAX(ID) FROM Customers; 
6
select max(id) from Customers 
8

conseguirlo en cualquier momento, puede hacerlo SELECT MAX(Id) FROM Customers.

En el procedimiento que usted agregue, también puede hacer uso de SCOPE_IDENTITY - para obtener la identificación agregada por última vez por ese procedimiento.
Esto es más seguro, porque le garantizará obtener su Id, solo en caso de que se agreguen otros a la base de datos al mismo tiempo.

16

Si acaba de insertar un registro en la tabla Clientes y necesita el valor del campo ID rellenado recientemente, puede usar la función SCOPE_IDENTITY. Esto solo es útil cuando el INSERT se ha producido dentro del mismo alcance que la llamada a SCOPE_IDENTITY.

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

SET @mostRecentId = SCOPE_IDENTITY() 

Esto puede o no ser útil para usted, pero es una buena técnica a tener en cuenta. También funcionará con columnas generadas automáticamente.

3

Si se utiliza uso AutoIncrement:

SELECT LAST_INSERT_ID();

Assumming que está utilizando MySQL: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

Postgres se encarga de esta función de manera similar a través de la currval (sequence_name).

Tenga en cuenta que usar MAX (ID) no es seguro, a menos que bloquee la tabla, ya que es posible (en un caso simplificado) tener otra inserción antes de llamar a MAX (ID) y pierde la identificación del primer inserto. Las funciones anteriores están basadas en sesiones, por lo que si se inserta otra sesión, aún obtendrá la ID que ha insertado.

+0

El uso de insertar con una subselección hace que el máximo (id) sea seguro, consulte mi respuesta. Pero, para ser honesto, la autoincrementación es una mejor opción si está disponible y usted no está * demasiado * preocupado por la portabilidad. – paxdiablo

+0

+1 para indicar que MAX (ID) no es seguro –

0

Depende de la implementación de SQL que esté utilizando. Tanto MySQL como SQLite, por ejemplo, tienen formas de obtener la última identificación de inserción. De hecho, si está utilizando PHP, incluso hay una función ingeniosa para exactamente esa mysql_insert_id().

Probablemente deberías utilizar esta función de MySQL en lugar de mirar todas las filas solo para obtener la ID de inserción más grande. Si tu mesa se pone grande, eso podría volverse muy ineficiente.

2

Si no se está usando campos de incremento automático, se puede lograr un resultado similar con algo como lo siguiente:

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

Esto asegurará que no hay posibilidad de una condición de carrera que podría ser causada por alguien sino insertando en la tabla entre su extracción de la identificación máxima y su inserción del nuevo registro.

Esto está utilizando SQL estándar, sin duda hay mejores formas de lograrlo con DBMS específico, pero no son necesariamente portátiles (algo que tomamos muy en serio en nuestra tienda).

7

Si está hablando MS SQL, esta es la forma más eficiente. Esto recupera la semilla de identidad actual de una tabla basada en cualquier columna que sea la identidad.

select IDENT_CURRENT('TableName') as LastIdentity 

Usando MAX(id) es más genérico, pero por ejemplo tengo una tabla con 400 millones de filas que tarda 2 minutos para conseguir la MAX(id). IDENT_CURRENT es casi instantánea ...

+1

Tendré que enviarlo a la memoria. Buen material. –

+1

¿De verdad? ¿Dos minutos? ¿Tienes un índice en la identificación? Debe ser casi instantáneo para encontrar min o max, incluso con 400 millones de filas. – paxdiablo

+0

Es un índice no exclusivo, no agrupado en la 'identidad' ... no estoy seguro de que sea el diseño correcto para la aplicación, pero es lo que es. SQL 2005 Enterprise con un esquema de partición también – Damon

-1
select * from tablename order by ID DESC 

que le dará la fila con id 22

+0

Esto devolverá todas las filas; con el correcto en la "parte superior" del conjunto de resultados. No devolverá únicamente la fila con la identificación máxima. – Ben

6
SELECT * FROM Customers ORDER BY ID DESC LIMIT 1 

A continuación, obtener el ID.

2

También puede usar el álgebra relacional. Un procedimiento largo poco, pero aquí se acaba de entender cómo MAX() funciona:

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

Su respuesta: Table_Name ⋈ E1

Básicamente lo que hace es restar conjunto de la relación ordenado (a, b) en el que un < b de A donde a, b A.

∈ Para los símbolos relación álgebra ver: Relational algebra From Wikipedia

+7

No creo que las soluciones de álgebra relacional sean bien recibidas para las preguntas de SQL. –

0

En 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; } 

tanto si $newid = 23 último registro de Identificación columna era 22.

+0

Esta es una pregunta sobre SQL. –

Cuestiones relacionadas