更新并在MSSQL中的单个查询中选择

时间:2018-05-29 14:32:25

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

是否可以在MSSQL中的单个查询中进行更新并选择

  id  │ item │ Amount  
 ═════╪══════╪════════ 
  123 │ anf  │ NULL    
  123 │ sh   │ 150     
  123 │ ab   │ NULL    
  123 │ fhy  │ NULL    
  123 │ fg   │ NULL    
  124 │ ab   │ NULL    
  124 │ sh   │ 650     
  125 │ ab   │ NULL    
  125 │ sh   │ 250     
  125 │ ab   │ NULL    
  126 │ ab   │ NULL    
  126 │ gh   │ NULL    
  126 │ sh   │ 10      

我有不同的ID和数量仅在item = sh时可用 我想在单个查询中输出如下所示

  id  │ item │ Amount  
 ═════╪══════╪════════ 
  123 │ anf  │ 150     
  123 │ sh   │ 150     
  123 │ ab   │ 150     
  123 │ fhy  │ 150     
  123 │ fg   │ 150     
  124 │ ab   │ 650     
  124 │ sh   │ 650     
  125 │ ab   │ 250     
  125 │ sh   │ 250     
  125 │ ab   │ 250     
  126 │ ab   │ 10      
  126 │ gh   │ 10      
  126 │ sh   │ 10      

6 个答案:

答案 0 :(得分:0)

使用窗口功能:

select *, max(amount) over (partition by id) as NewAmount
from table t
where item = 'sh';

要获得更新,您可以使用updatable cte

with t as (
    select *, max(amount) over (partition by id) as NewAmount
    from table 
    where item = 'sh'
  )
update t
set amount = NewAmount
where amount is null;

答案 1 :(得分:0)

简答:不,您不能同时更改存储在表(UPDATE)中的数据并在单个查询中显示表(SELECT)中的数据。您可以在两个查询中执行此操作,并可以将它们捆绑在事务中以确保它们一起成功或失败。

另外为了清楚起见,当你说UPDATE你的意思是更新表数据,还是选择它然后修改它以进行SELECT查询但是实际上不将这些数据存储在表中?

另外,请解释return set-Amount列的工作原理。

提前致谢。

答案 2 :(得分:0)

试试这个:

SELECT t.id, t.item, sub.amount
FROM t
INNER JOIN
(
SELECT id, amount
FROM t
WHERE item = 'sh'
) sub
ON t.id = sub.id

创建一个包含每个id的金额的派生表。然后将其加入主表。

答案 3 :(得分:0)

可以在一个语句中更新和选择,参见OUTPUT子句:http://www.sqlservercentral.com/articles/T-SQL/156604/

答案 4 :(得分:0)

如果您只想选择金额,可以使用窗口函数:

select id, item, max(case when item = 'sh' then amount end) over (partition by id) as Amount
from t ;

如果您想更改数据,请使用update

with toupdate as (
      select t.*, max(case when item = 'sh' then amount end) over (partition by id) as newAmount
      from t
     )
update toupdate
    set amount = newAmount
    where amount is null;

我认为两者都没有优势。如果您需要更新并希望返回结果,则发出两个查询。

答案 5 :(得分:0)

与您的问题相关的内容已在此处发布,to see it click here

示例:

更新查询:

​Server=learningserver.com:1600;Database=learning_db;User ID=...;Password=...;

选择查询:

UPDATE tblPopUp SET PopUp = 'False' WHERE DisplayNo = 1

以下是发布的答案之一:

SELECT Period FROM tblPopUp WHERE DisplayNo = 1

希望它对你有所帮助。