Sql-Server

替代更新表中的每一行

  • February 6, 2017

我下面的語法有效(可能不是最有效的語法,但它幾乎可以達到目的)。我遇到的問題是,當UPDATE語句執行時,由於JOIN條件的原因,符合條件的每一行都會更新。我只想UPDATE1 行,每empName. 也許我可以使用該欄位AcctIDWorked來更新該欄位的 theMAX()或 the MIN()?老實說,這兩種方式都沒有關係,因為每次更新我只需要一行。empName

我怎樣才能做到這一點?

DDL 下面和目前語法

IF OBJECT_ID('dbo.__SalesDetailInfo', 'U') IS NOT NULL 
   DROP TABLE dbo.__SalesDetailInfo; 

IF OBJECT_ID('dbo.__Sales', 'U') IS NOT NULL 
   DROP TABLE dbo.__Sales; 

Create Table __Sales
(
   EmpName varchar(max)
   ,TotalSaleAmount decimal(10,2)
)

Insert Into __Sales (EmpName, TotalSaleAmount) Values
('OWT', '167.30'),('Fit D', '512.22'),('Mike',  '4147.60')
,('Curtis', '66.96'),('Curtis', '1165.58'),('Curtis',   '1507.64')
,('Curtis', '1551.79'),('Curtis',   '8132.13'),('Curtis',   '28.62')
,('Sam',    '499.00'),('Curtis',    '1159.76'),('Sam',  '2011.98')
,('Mike',   '450.00'),('Mike',  '1453.60'),('Sam',  '762.45')
,('Curtis', '1056.00'),('Mike', '1596.50'),('OWT',  '1768.80')
,('Mike',   '1200.00'),('Mike', '1500.00'),('Fit D',    '17921.30')
,('Curtis', '456.73'),('Curtis',    '944.23'),('Curtis',    '2242.00')
,('Mike',   '437.50'),('Sam',   '3258.07'),('Sam',  '3258.07')
,('OWT',    '7263.57'),('OWT',  '7225.57'),('OWT',  '224.63')
,('Curtis', '569.89')

Create Table __SalesDetailInfo
(
   EmpName varchar(max)
   ,TotalSales decimal(10,2)
   ,AcctIDWorked int
)

Insert Into __SalesDetailInfo (EmpName, AcctIDWorked) Values
('Curtis', 1), ('Curtis', 2), ('Curtis', 3), ('Curtis', 4)
,('Fit D', 22), ('Fit D', 11), ('Fit D', 44)
,('Mike', 110), ('Mike', 111), ('Mike', 113), ('Mike', 114)
,('Sam', 300), ('Sam', 310), ('Sam', 340)
,('OWT', 500), ('OWT', 550), ('OWT', 580), ('OWT', 590)

;WITH UPDATECTE AS
(Select EmpName, sumTSA=SUM(TotalSaleAmount)
FROM __Sales
GROUP BY EmpName)
UPDATE __SalesDetailInfo
SET TotalSales = sumTSA
FROM UPDATECTE cte
 INNER JOIN __SalesDetailInfo t
   ON RTRIM(LTRIM(cte.EmpName)) = RTRIM(LTRIM(t.EmpName))
select t.*, s.sumTSA
from __SalesDetailInfo t
join ( Select EmpName, sumTSA = SUM(TotalSaleAmount)
      FROM __Sales
      GROUP BY EmpName
    ) as s
ON RTRIM(LTRIM(s.EmpName)) = RTRIM(LTRIM(t.EmpName))

您可以使用它來創建視圖。

引用自:https://dba.stackexchange.com/questions/163294