是否可以在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
答案 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
希望它对你有所帮助。