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.