Como selecionar o último registro de uma tabela no SQL?


133

Este é um código de amostra para selecionar todos os registros de uma tabela. Alguém pode me mostrar como selecionar o último registro dessa tabela?

select * from table

Quando uso: SELECT * FROM TABLE ORDER BY ID DESC LIMIT Recebo este erro: Linha 1: sintaxe incorreta perto de 'LIMIT'. Este é o código que eu uso:

private void LastRecord()
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HELPDESK_OUTLOOKConnectionString3"].ToString());

    conn.Open();
    SqlDataReader myReader = null;
    SqlCommand myCommand = new SqlCommand("SELECT * FROM HD_AANVRAGEN ORDER BY " +
                "aanvraag_id DESC LIMIT 1", conn);
    myReader = myCommand.ExecuteReader();
    while (myReader.Read())
    {
        TextBox1.Text = (myReader["aanvraag_id"].ToString());
        TextBox1.Text += (myReader["wijziging_nummer"].ToString());
        TextBox1.Text += (myReader["melding_id"].ToString());
        TextBox1.Text += (myReader["aanvraag_titel"].ToString());
        TextBox1.Text += (myReader["aanvraag_omschrijving"].ToString());
        TextBox1.Text += (myReader["doorlooptijd_id"].ToString());
        TextBox1.Text += (myReader["rapporteren"].ToString());
        TextBox1.Text += (myReader["werknemer_id"].ToString());
        TextBox1.Text += (myReader["outlook_id"].ToString());
    }
}

Bem, você tem que pedir alguma coisa. Você tem uma chave primária? Talvez uma identificação?
alexn

O que você quer dizer com "último registro"? Com o valor mais alto da coluna da chave primária?
Marcin Wroblewski

Respostas:


337

Sem mais informações, qual banco de dados, etc, o melhor que podemos fazer é algo como

Servidor SQL

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
top 1 vai levar o primeiro, não?
Tassisto

30
Sim, mas é por isso que você encomenda por DESC
Adriaan Stander

3
Mas se você usou a fim de DESC para um milhão de discos que irá atrasar o seu @AdriaanStander consulta
Charles Hernandez

1
O mysql também funciona com o servidor sql. É um comando sql genérico.
azhar22k

1
@ itz-azhar: o formulário MySQL desta consulta não é um comando SQL genérico; a LIMITpalavra-chave é uma extensão do SQL que apenas alguns RDBMSs implementam; notavelmente, Oracle não tem uma LIMITpalavra
landru27 11/1118

23

Supondo que você tenha uma coluna de ID:

SELECT TOP 1 *
  FROM table
 ORDER
    BY Id DESC;

Além disso, isso funcionará no SQL Server. Eu acho que o MySQL você pode precisar usar:

SELECT *
  FROM table
 ORDER
    BY Id DESC
 LIMIT 1

Mas não tenho 100% de certeza sobre isso.

EDITAR

Olhando para as outras respostas, agora estou 100% confiante de que estou correto com a instrução MySQL: o)

EDITAR

Acabei de ver seu último comentário. Você poderia fazer:

SELECT MAX(Id)
  FROM table

Isso fornecerá o número de identificação mais alto.


2
SELECIONE MAX (id) DOS dados Funciona perfeitamente!
Ricardo Fercher 21/03

15

para obter a última linha de um banco de dados SQL, use esta string sql:

SELECT * FROM TableName WHERE id=(SELECT max(id) FROM TableName);

Resultado:

Última linha do seu db!


3
Funciona completamente bem com a Oracle e também é mais rápido do que a classificação
MaKiPL

Esse é o melhor. Sem classificação, sem "TOP 1", apenas consultas com suporte e desempenho. Perfeito.
Matt F.

7
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Sim, este é o mysql, SQL Server:

SELECT TOP 1 * FROM Table ORDER BY ID DESC

isso dá um erro! Eu pensei que este é SQL mas é MySQL
Tassisto

1
Editado para o SQL Server, no entanto, você não especificou seu DBMS na pergunta.
Simon

3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

2

O último é apenas o primeiro quando você inverte seu pedido.


0

No Oracle, você pode fazer:

SELECT *
FROM (SELECT EMP.*,ROWNUM FROM EMP ORDER BY ROWNUM DESC)
WHERE ROWNUM=1;

Essa é uma das maneiras possíveis.


0
select ADU.itemid, ADU.startdate, internalcostprice 
from ADUITEMINTERNALCOSTPRICE ADU

right join

   (select max(STARTDATE) as Max_date, itemid 
   from ADUITEMINTERNALCOSTPRICE
   group by itemid) as A

on A.ITEMID = ADU.ITEMID
and startdate= Max_date

1
Bem-vindo ao stackoverflow. Além da resposta que você forneceu, considere fornecer uma breve explicação de por que e como isso resolve o problema.
jtate

0

É sempre uma boa prática no design de sua tabela ter um identificador de linha automático, como

 [RowID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL

, então você pode identificar sua última linha

 select * from yourTable where rowID =  @@IDENTITY 

0

Eu acho que isso deve fazer.

declare @x int;
select @x = max(id) from table_name;
select * from where id = @x;

0

Se você tiver um campo autoincrementável (por exemplo ID), poderá fazer algo como: SELECT * FROM foo WHERE ID = (SELECT max(ID) FROM foo)


-1
$sql="SELECT tot_visit FROM visitors WHERE date = DATE(NOW()) - 1 into @s                
$conn->query($sql);
$sql = "INSERT INTO visitors (nbvisit_day,date,tot_visit) VALUES (1,CURRENT_DATE,@s+1)";
$conn->query($sql);

você leu a pergunta com atenção? como INSERTum novo valor está relacionado a "como selecionar o último registro dessa tabela"?
landru27

2
Bem-vindo ao Stack Overflow! Obrigado pelo snippet de código, que pode fornecer ajuda imediata e limitada. Uma explicação adequada melhoraria bastante seu valor a longo prazo , descrevendo por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras perguntas semelhantes. Edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
sepehr

Não escreva código específico de php quando o OP perguntar apenas sobre a linguagem SQL.
Steve Moretz


-1

Eu votei em Ricardo. Na verdade, max é muito eficiente do que classificar. Veja as diferenças. é excelente.

Eu tive que obter o último registro de linha / atualização (timeStamp)

`sqlite> select timeStamp from mypadatav2 order by timeStamp desc limit 1;
 2020-03-11 23:55:00
 Run Time: real 1.806 user 1.689242 sys 0.117062`

`sqlite> select max(timeStamp) from mypadatav2;
 2020-03-11 23:55:00
 Run Time: real 0.553 user 0.412618 sys 0.134340`
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.