2017-07-06 69 views
2

我想刪除特定列最高值的行的特定列的最高值刪除一行

(我知道,有針對的答案,但他們沒有爲我的工作因爲某種原因)

所有編碼我在Visual Studio C#做SQL

MyDatabase的:小時

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:'Index'附近語法不正確。如果 這是打算作爲表提示的一部分,現在需要WITH關鍵字和 括號。有關正確的 語法,請參閱SQL Server聯機叢書。

+1

'DELETE FROM小時WHERE [索引] IN(選擇MAX([索引] )從幾小時)' –

+0

它通用的名稱索引像'%TableName%Id'。在你的情況下,它將是'HourId'。因此你將來會避免這些問題。 –

+0

沒有問題,但爲什麼所有其他列varchar(max)? –

回答

6

索引是一個關鍵字,您需要使用[Index]

+1

加我一個。第一次真正的嘗試找到問題的根源,而不是告訴其他方式來實現目標。 –

+0

+1您還可以使用別名並限定列名嗎?無論是否工作 - 或者是括號是必要的? –

+0

您需要一個CTE或一個子選擇來使用列別名,並且在初始引用列時仍然需要括號。我認爲這個專欄可能實際上應該被稱爲Id,這將完全消除這個問題。 – ajg

0

在SQL Server中,你可以這樣做:

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

如果您擔心index可能有重複,然後用deletetop

2

嘗試

delete from hours where Index = max(index); 
+1

這也將失敗像OP的。 –

1

正如「AJG」所提到的,問題在第二個查詢是保留關鍵字Index用方括號的使用逃脫關鍵字

更好的辦法來做到這一點是使用CTE

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

試試這個;

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

Nikhil Agrawal是正確的。 [索引]需要。上面的例子不正確,因爲我錯過了它 – JPF

0

這應該工作;

DELETE FROM hours 
WHERE Index = max(index); 
0
delete from hours where Index = (select max(Index) from hours) 

這個查詢將在V 工作,我猜你是那缺少括號爲什麼你得到錯誤

0
delete from tablename 
where columnname = 
(select dummytable.maxVal from 
    (select max(columnname) as maxVal from tablename) 
    dummytable 
);