通过Select语句更新SQL Server

时间:2012-08-20 22:17:37

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

我有以下sql语句,我想更新select语句返回的行上的字段。这是我的选择吗?我尝试过的东西并没有给我预期的结果:

SELECT 
Flows_Flows.FlowID, 
Flows_Flows.Active, 
Flows_Flows.BeatID,
Flows_Flows.FlowTitle, 
Flows_Flows.FlowFileName, 
Flows_Flows.FlowFilePath, 
Flows_Users.UserName, 
Flows_Users.DisplayName, 
Flows_Users.ImageName,
Flows_Flows.Created, 
SUM(CASE WHEN [Like] = 1 THEN 1 ELSE 0 END) AS Likes,  
SUM(CASE WHEN [Dislike] = 1 THEN 1 ELSE 0 END) AS Dislikes 
FROM Flows_Flows 
INNER JOIN Flows_Users ON Flows_Users.UserID = Flows_Flows.UserID 
LEFT JOIN Flows_Flows_Likes_Dislikes ON          
Flows_Flows.FlowID=Flows_Flows_Likes_Dislikes.FlowID 
WHERE Flows_Flows.Active = '1' AND Flows_Flows.Created < DATEADD(day, -60, GETDATE())
Group By Flows_Flows.FlowID, Flows_Flows.Active, Flows_Flows.BeatID, 
Flows_Flows.FlowTitle, Flows_Flows.FlowFileName,  Flows_Flows.FlowFilePath,        
Flows_Users.UserName, Flows_Users.DisplayName, Flows_Users.ImageName,     
Flows_Flows.Created 
Having SUM(CASE WHEN [Like] = 1 THEN 1 ELSE 0 END) = '0' AND SUM(CASE WHEN [Dislike] = 1              
THEN 1 ELSE 0 END) >= '0'

这个select语句完全返回我需要的内容,但我想将Active字段从1更改为0。

3 个答案:

答案 0 :(得分:1)

是 - 一般结构可能是这样的:(注意你没有声明你的主键)

UPDATE mytable
set myCol = 1
where myPrimaryKey in (
select myPrimaryKey from mytable where interesting bits happen here )

答案 1 :(得分:0)

因为你没有在你想要达到的结果中更清楚地表达你的问题,我将根据自己的假设提供答案。

<强>假设

你有一个select语句,可以为你提供东西,它可以根据需要运行。你想要它做的是让它返回结果并动态更新那些选定的行 - 基本上就像说“找到X,告诉我关于X并使它成为Y”。

<强> Anwser

如果我的假设是正确的,不幸的是我认为你没有办法做到这一点。 select不会改变表,它只能获取信息。同样,更新不会提供比更新行数更多的详细信息。

但是不要放弃,取决于你想要达到的结果,你有其他选择。

<强>替代

  1. 如果您只想更新已选择的行,则可以 只需编写一个UPDATE语句来执行此操作,并且@Randy已提供 这是一个很好的例子。

  2. 如果您想减少对服务器的调用,这意味着您想要正确使用 一次调用服务器并获取结果,以及更新 在行中,您可以编写存储过程来执行此操作。

  3. 存储过程就像您在编程语言中编写的函数一样。它本质上定义了一组sql操作并为它们命名。每次调用该存储过程时,都会使用提供的输入执行操作集(如果有)。

    因此,如果您想了解有关商店程序的更多信息,请查看: http://www.mysqltutorial.org/introduction-to-sql-stored-procedures.aspx

答案 2 :(得分:0)

如果我理解正确你正在寻找一种语法,如果它是1,就能选择Active的值为0.这样的语法是

SELECT 
 Active= CASE WHEN Active=1 THEN 0 ELSE Active END
FROM
 <Tables>
WHERE
 <JOIN Conditions>