2013-04-25 62 views
0

如何使用VB运行查询,该查询将返回基于列appClickCount的TOP 10结果并将列appFAIList更新为1,并且TOP 10以下的任何列将赋予列appFAIList值0?前十和更新

Using sqlCon = New SqlConnection("Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\ITCSDatabase.mdf;Integrated Security=True") 
     sqlCon.Open() 
     Dim sqlText = "SELECT top 10 appClickCount " & _ 
      "FROM appTable" & _ 
     "UPDATE appTable SET appFAIList = 1" 
     Dim cmd = New SqlCommand(sqlText, sqlCon) 
     cmd.ExecuteScalar() 
    End Using 

回答

3

运行该SQL语句,而不是

with t as (
    select *, rn=row_number() over (order by 1/0) 
    from appTable) 
update t set 
    appFAIList = case when rn<=10 then 1 else 0 end 

vb.net代码很马车虽然。您正在使用ExecuteScalar,它旨在返回单行单列结果。正如所写,它会给你第一个appClickCount值。

的另一个问题是,在SQL Server中使用TOP 10没有对应的ORDER BY意味着它将相当随意(又名“随机”),从表中返回任何10个记录。

+1

order by 1/0 DivisionByZero异常? – realnumber3012 2013-04-25 05:07:15

+1

@ realnumber3012为什么不在评论前尝试一下。看看我的个人资料。 [SQL小提琴演示](http://sqlfiddle.com/#!6/c1c3b/2/2) – RichardTheKiwi 2013-04-25 05:08:26

+0

尝试在oracle中。不工作)SQL SERVER不会安装在我的工作站中 – realnumber3012 2013-04-25 05:12:53

0
UPDATE a 
SET a.appFAIList = 1 
    FROM appTable AS a 
    INNER JOIN 
    (SELECT top 10 appClickCount FROM appTable) AS b ON a.SomeField = b.SomeField 

SomeField - may be primary key of your table