簡體   English   中英

SQL Server如何更改視圖,以便在插入表時不會產生重復?

[英]SQL Server How do I change my view so it doesn't produces duplicates when inserting into a table?

我有一個看法

CREATE VIEW v1 AS
SELECT [EmployeeNo.],
       SUM([HoursTaken]) AS HoursTaken
FROM [dbo].[HolidayRequestForm]
GROUP BY [EmployeeNo.]

我想將此視圖的輸出放入表中。 運用

INSERT INTO [dbo].[Employees] 

SELECT * FROM v1;

哪個產生

EmployeeID  | HoursRequested |  
------------+----------------+
1           | 8              |     
2           | 16             |     
3           | 8              | 

我將此視圖與觸發器配合使用,因此當[dbo]。[HolidayRequestForm]更新或插入新行時,它在我的表[dbo]上產生重復的行。[雇員]

我如何只更新表[dbo]。[Employees]而又不產生重復項呢?

您正在尋找合並

根據與源表的聯接結果在目標表上執行插入,更新或刪除操作。 例如,您可以根據另一個表中的差異通過在一個表中插入,更新或刪除行來同步兩個表。

MERGE [dbo].[Employees]  AS target  
USING (SELECT [EmployeeNo.], HoursTaken FROM v1) 
    AS source ([EmployeeNo.], HoursTaken)  
ON (target.EmployeeID = source.[EmployeeNo.])  
WHEN MATCHED THEN   
    UPDATE SET HoursRequested = source.HoursTaken  
WHEN NOT MATCHED THEN  
    INSERT (EmployeeID , HoursRequested)  
    VALUES (source.[EmployeeNo.], source.HoursTaken)  

無論如何,在每次更新視圖時更新孔表都不是一個好主意。

試試這個查詢

 MERGE EMPLOYEES E 
using v1 
ON E.employeeid = v1.employeeno 
WHEN matched THEN 
  UPDATE SET E.hoursrequested = v1.hourstaken 
WHEN NOT MATCHED BY TARGET THEN 
  INSERT (employeeid, 
          hoursrequested) 
  VALUES (v1.employeeno, 
          v1.hourstaken);

有關更多信息, 請訪問https://www.essentialsql.com/introduction-merge-statement/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM