【问题标题】:Delete a row with the highest value of a specific column删除具有特定列的最高值的行
【发布时间】:2017-07-06 11:56:33
【问题描述】:

我想删除特定列上值最高的行

(我知道有答案,但由于某种原因,它们都不适合我)

我在 Visual Studio C# 中使用 SQL 进行的所有编码

我的数据库:小时

Hours_Left | Hours_Spent | Time_Written | Mode | Time_Start | Time_End | Index
==============================================================================
aa         | bb          | cc           | dd   | ee         | ff       | 3
gg         | hh          | ii           | jj   | kk         | ll       | 4
mm         | nn          | oo           | pp   | qq         | rr       | 5
ss         | tt          | uu           | vv   | ww         | xx       | 6

[Hours_Left]   VARCHAR (MAX) NULL,
[Hours_Spent]  VARCHAR (MAX) NULL,
[Time_Written] VARCHAR (MAX) NULL,
[Mode]         VARCHAR (MAX) NULL,
[Time_Start]   VARCHAR (MAX) NULL,
[Time_End]     VARCHAR (MAX) NULL,
[Index]        INT           IDENTITY (1, 1) NOT NULL

我的代码:

if (con.State != ConnectionState.Open)
        {
            con.Close();
            con.Open();
        }
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = @"DELETE FROM hours WHERE Index = select max(Index) from hours limit 1";
        cmd.ExecuteNonQuery();
        con.Close();
        Display_Data();

commandText 时也不工作

@"DELETE TOP(1) FROM hours
  WHERE Index in 
  (SELECT TOP(1) Index FROM hours
  ORDER BY Index DESC);";

我想删除最高索引的整行 - 即删除索引为 6 的行,它是最高索引

错误:

cmd.ExecuteNonQuery();

错误是:

System.Data.SqlClient.SqlException:''索引'附近的语法不正确。如果 这旨在作为表提示的一部分,一个 WITH 关键字和 现在需要括号。请参阅 SQL Server 联机丛书了解正确的 语法。

【问题讨论】:

  • DELETE FROM hours WHERE [Index] IN (select max([Index]) from hours)
  • 通常将索引命名为%TableName%Id。在您的情况下,它将是HourId。因此,您将来会避免此类问题。
  • 与问题无关,但为什么所有其他列都是 varchar(max)?
  • @MadMyche 我不知道,我需要一个字符串但文本出现问题

标签: c# sql sql-server sql-delete


【解决方案1】:

索引是关键字,需要使用[Index]

【讨论】:

  • 加我一份。第一次真正尝试找出问题的根本原因,而不是告诉其他实现目标的方法。
  • +1 您能否也使用别名来限定列名?这会起作用吗 - 或者括号是必要的吗?
  • 您需要一个 CTE 或一个子选择来使用列别名,并且在最初引用该列时仍然需要括号。我认为该列可能实际上应该被称为 Id 无论如何这将完全消除问题。
【解决方案2】:

试试

 delete from hours where Index = max(index);

【讨论】:

  • 这也会像 OP 一样失败。
【解决方案3】:

试试这个;

delete x
from dbo.[Hours] x
where exists(select 1 from dbo.[Hours] xx having MAX(xx.[Index])=x.[Index])

【讨论】:

  • Nikhil Agrawal 是正确的。 [索引] 需要。上面的例子不正确,因为我错过了它
【解决方案4】:

正如“ajg”所说,第二个查询的问题是使用保留关键字Index使用方括号来转义关键字

更好的方法是使用CTE

;with cte as
(
select top (1) * from hours order by [Index] desc
)
delete from cte

【讨论】:

    【解决方案5】:

    在 SQL Server 中,您可以:

    DELETE h
        FROM hours h
        WHERE h.Index = (select max(h2.Index) from hours h2) ;
    

    如果您担心index 可能有重复项,请使用deletetop

    【讨论】:

      【解决方案6】:
       delete from tablename 
       where columnname = 
       ( select dummytable.maxVal from 
          (select max(columnname) as maxVal from tablename) 
         dummytable
       );
      

      【讨论】:

        【解决方案7】:
          delete from hours where [Index] = (select max([Index]) from hours)
        

        我猜你缺少括号。

        【讨论】:

          最近更新 更多