【问题标题】:How to select the last record of a table in SQL?如何在 SQL 中选择表的最后一条记录?
【发布时间】:2011-07-08 16:04:33
【问题描述】:

这是从表中选择所有记录的示例代码。有人可以告诉我如何选择该表的最后一条记录吗?

select * from table

当我使用时:SELECT * FROM TABLE ORDER BY ID DESC LIMIT 我收到此错误:第 1 行:'LIMIT' 附近的语法不正确。 这是我使用的代码:

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());
    }
}

【问题讨论】:

  • 嗯,你必须点东西。你有主键吗?也许是身份证?
  • “最后一条记录”是什么意思?主键列的值最高?
  • 2011 年是很多年前的事了。今天你应该使用offset 0 rows fetch first 1 row only - 因为它符合 ANSI SQL 并适用于大多数现代数据库。

标签: sql sql-server sql-server-2008


【解决方案1】:

没有任何进一步的信息,我们能做的最好的数据库等就是

Sql 服务器

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

【讨论】:

  • top 1 会拿第一个,不是吗?
  • 是的,但这就是您按 DESC 订购的原因
  • 但是如果你使用 DESC 的顺序来处理一百万条记录,它会降低你的查询速度@AdriaanStander
  • mysql 也适用于 sql server。这是一个通用的 sql 命令。
  • @itz-azhar : 这个查询的 MySQL 形式不是一个通用的 SQL 命令; LIMIT 关键字是 SQL 的扩展,只有一些 RDBMS 实现;值得注意的是,Oracle 没有 LIMIT 关键字
【解决方案2】:
SELECT * FROM table ORDER BY Id DESC LIMIT 1

【讨论】:

    【解决方案3】:
    SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
    

    是的,这是 mysql,SQL Server:

    SELECT TOP 1 * FROM Table ORDER BY ID DESC
    

    【讨论】:

    • 这给出了一个错误!我以为这是 SQL 但它是 MySQL
    • 已编辑到 SQL Server,但是您没有在问题中指定您的 DBMS。
    【解决方案4】:

    假设您有一个 Id 列:

    SELECT TOP 1 *
      FROM table
     ORDER
        BY Id DESC;
    

    此外,这也适用于 SQL Server。我认为您可能需要使用 MySQL:

    SELECT *
      FROM table
     ORDER
        BY Id DESC
     LIMIT 1
    

    但是,我不能 100% 确定这一点。

    编辑

    查看其他答案,我现在 100% 确信我的 MySQL 语句是正确的 :o)

    编辑

    刚刚看到您的最新评论。你可以这样做:

    SELECT MAX(Id)
      FROM table
    

    这将为您提供最高的 ID 号。

    【讨论】:

      【解决方案5】:

      当您颠倒您的顺序时,最后一个只是第一个。

      【讨论】:

        【解决方案6】:

        在 Oracle 中,您可以这样做:

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

        这是可能的方法之一。

        【讨论】:

          【解决方案7】:

          要获取 SQL-Database 的最后 ,请使用以下 sql 字符串:

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

          输出:

          你的数据库的最后一行!

          【讨论】:

          • 在 oracle 上也完全可以正常工作,并且比排序更快
          【解决方案8】:
          $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);
          

          【讨论】:

          • 您仔细阅读问题了吗? INSERT'ing 新值与“如何选择该表的最后一条记录”有何关系?
          • 欢迎来到 Stack Overflow!感谢您提供代码 sn-p,它可能会提供一些有限的即时帮助。通过描述为什么这是解决问题的好方法,正确的解释将极大地改进其long-term value,并使其对有其他类似问题的未来读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
          • 当 OP 只询问 SQL 语言时,不要编写特定于 php 的代码。
          【解决方案9】:

          你也可以这样做:

          SELECT LAST (column_name) AS LAST_CUSTOMER FROM table_name;

          【讨论】:

          【解决方案10】:
          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
          

          【讨论】:

          • 欢迎来到stackoverflow。除了您提供的答案之外,请考虑提供一个简短说明,说明为什么以及如何解决此问题。
          【解决方案11】:

          在表格设计中使用自动行标识符始终是一个好习惯,例如

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

          ,那么你可以通过

          来识别你的最后一行
           select * from yourTable where rowID =  @@IDENTITY 
          

          【讨论】:

          • 这是一个很酷的技巧,因为 2M+ 的记录非常快(至少在我的情况下)谢谢
          【解决方案12】:

          我认为应该这样做。

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

          【讨论】:

          • 不保证 max(id) 总是最后一行。
          【解决方案13】:

          如果您有一个自增字段(例如ID),那么您可以执行以下操作: SELECT * FROM foo WHERE ID = (SELECT max(ID) FROM foo)

          【讨论】:

            【解决方案14】:

            我对里卡多投了赞成票。实际上 max 比 sort 有效得多。 查看差异。它非常好。

            我必须得到最后一行/更新记录(时间戳)

            `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`
            

            【讨论】:

              【解决方案15】:

              MS SQL Server 多年来一直支持 ANSI SQL FETCH FIRST

              SELECT * FROM TABLE
              ORDER BY ID DESC 
              OFFSET 0 ROWS FETCH FIRST 1 ROW ONLY
              

              (适用于大多数现代数据库。)

              【讨论】:

                【解决方案16】:

                几乎所有答案都假定 ID 列是有序的(并且可能会自动递增)。但是,在某些情况下,当 ID 列排序时,ORDER BY 语句就没有任何意义。

                最后插入的 ID 可能并不总是最高的 ID,它只是最后一个(唯一的)条目。

                针对这种情况的一种可能解决方案是动态创建行 ID:

                SET @r = 0;
                SELECT * FROM (SELECT *, (@r := @r + 1) AS r_id FROM my_table) AS tmp
                    ORDER BY r_id DESC LIMIT 1;
                

                【讨论】:

                  【解决方案17】:

                  如果您的表格没有自动递增的值,或者没有好的元素可供订购,您可以像这样获得任何集合中项目的任意顺序

                  SELECT
                      [item]
                  FROM (
                      SELECT
                          *
                          , ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY GETDATE()) 'RN'
                      FROM [TABLE]
                  ) RDR 
                  WHERE [RN] = (
                      SELECT
                          MAX([RN])
                      FROM (
                          SELECT
                              *
                              , ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY GETDATE()) 'RN'
                          FROM [TABLE]
                      ) RDR 
                  )
                  

                  一个重要的警告是,对于更大的数据集,这方面的性能将非常糟糕。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-02-09
                    • 2011-02-09
                    • 1970-01-01
                    • 2021-11-26
                    • 1970-01-01
                    • 2023-03-07
                    相关资源
                    最近更新 更多