Jak wybrać ostatni rekord tabeli w SQL?

133

To jest przykładowy kod służący do wybierania wszystkich rekordów z tabeli. Czy ktoś może mi pokazać, jak wybrać ostatni rekord tej tabeli?

select * from table

Kiedy używam: SELECT * FROM TABLE ORDER BY ID DESC LIMIT pojawia się ten błąd: Wiersz 1: Niepoprawna składnia w pobliżu „LIMIT”. Oto kod, którego używam:

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());
    }
}
Tassisto
źródło
Cóż, musisz coś zamówić. Czy masz klucz podstawowy? Może dowód osobisty?
alexn
Co masz na myśli mówiąc „ostatni rekord”? Z najwyższą wartością kolumny klucza podstawowego?
Marcin Wróblewski

Odpowiedzi:

337

Bez dalszych informacji, która baza danych itp. Najlepiej możemy zrobić

Sql Server

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1
Adriaan Stander
źródło
1
top 1 weźmie pierwszą, prawda?
Tassisto
30
Tak, ale właśnie dlatego zamawiasz
Adriaan Stander
3
Ale jeśli wykorzystałeś zamówienie DESC dla miliona rekordów, spowolni to twoje zapytanie @AdriaanStander
Charles Hernandez
1
MySQL działa również z serwerem sql. To ogólne polecenie sql.
azhar22k
1
@ itz-azhar: forma tego zapytania MySQL nie jest ogólnym poleceniem SQL; LIMITkluczowe jest rozszerzeniem SQL, że tylko niektóre RDBMS typu wdrożenia; w szczególności Oracle nie ma LIMITsłowa kluczowego
landru27 11.11.18
23

Zakładając, że masz kolumnę Id:

SELECT TOP 1 *
  FROM table
 ORDER
    BY Id DESC;

Będzie to również działać na SQL Server. Myślę, że MySQL możesz potrzebować:

SELECT *
  FROM table
 ORDER
    BY Id DESC
 LIMIT 1

Ale nie jestem tego w 100% pewien.

EDYTOWAĆ

Patrząc na inne odpowiedzi, jestem teraz w 100% pewien, że zgadzam się z instrukcją MySQL: o)

EDYTOWAĆ

Właśnie zobaczyłem Twój najnowszy komentarz. Mógłbyś:

SELECT MAX(Id)
  FROM table

W ten sposób otrzymasz najwyższy numer identyfikacyjny.

Neil Knight
źródło
2
SELECT MAX (id) FROM data Działa idealnie!
Ricardo Fercher,
15

aby uzyskać ostatniego wiersza o SQL Database wykorzystywać ten ciąg sql:

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

Wynik:

Ostatnia linia twojego db!

Ricardo Fercher
źródło
3
Działa całkowicie dobrze również z Oracle i jest szybszy niż sortowanie
MaKiPL,
Ten jest najlepszy. Bez sortowania, bez "TOP 1", tylko obsługiwane i wydajne zapytania. Idealny.
Matt F.
7
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Tak, to mysql, SQL Server:

SELECT TOP 1 * FROM Table ORDER BY ID DESC
Szymon
źródło
to daje błąd! Myślałem, że to SQL, ale to MySQL
Tassisto
1
Edytowano na SQL Server, ale nie podałeś swojego DBMS w pytaniu.
Simon
3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

źródło
2

Ostatni jest tylko pierwszym, gdy odwrócisz zamówienie.

jeje
źródło
0

W Oracle możesz:

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

To jeden z możliwych sposobów.

GeeDee
źródło
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
Panjas51
źródło
1
Witamy w stackoverflow. Oprócz udzielonej odpowiedzi, rozważ podanie krótkiego wyjaśnienia, dlaczego i jak to rozwiązuje problem.
jtate
0

Przy projektowaniu tabeli zawsze dobrze jest mieć automatyczny identyfikator wiersza, taki jak

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

, możesz zidentyfikować ostatni wiersz według

 select * from yourTable where rowID =  @@IDENTITY 
Jenna Leaf
źródło
0

Myślę, że to powinno wystarczyć.

declare @x int;
select @x = max(id) from table_name;
select * from where id = @x;
Chanuka Fernando
źródło
0

Jeśli masz pole samo-zwiększające się (powiedzmy ID), możesz zrobić coś takiego: SELECT * FROM foo WHERE ID = (SELECT max(ID) FROM foo)

Bostone
źródło
-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);
Hani Charara
źródło
czy uważnie przeczytałeś pytanie? Jak INSERTnowa wartość ma się do „jak wybrać ostatni rekord z tej tabeli”?
landru27
2
Witamy w Stack Overflow! Dziękujemy za fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego długoterminową wartość , opisując, dlaczego jest to dobre rozwiązanie problemu, i uczyniłoby go bardziej użytecznym dla przyszłych czytelników z innymi podobnymi pytaniami. Zmień swoją odpowiedź, dodając wyjaśnienie, w tym przyjęte założenia.
wrzesień
Nie pisz kodu specyficznego dla php, gdy OP pyta tylko o język SQL.
steve moretz
-1

Możesz też zrobić coś takiego:

SELECT LAST (column_name) AS LAST_CUSTOMER FROM table_name;

vikas95prasad
źródło
Należy pamiętać, że ostatni () funkcja jest obsługiwana tylko w MS Access javatpoint.com/sql-select-last
Malik Masis
-1

Głosowałem za Ricardo. Właściwie max jest dużo wydajniejszy niż sortowanie. Zobacz różnice. to jest świetne.

Musiałem pobrać ostatni wiersz / rekord aktualizacji (znacznik czasu)

`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`
user12403395
źródło