SQL Server Как мне изменить свое представление, чтобы оно не создавало дубликаты при вставке в таблицу? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть представление

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]. [Employees]

Как мне заставить его просто обновить таблицу [dbo]. [Employees], а не и не создавать дубликаты?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Попробуйте этот запрос

 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/

0 голосов
/ 14 декабря 2018

Вы ищете Слияние

Выполняет операции вставки, обновления или удаления в целевой таблице на основе результатов объединения с исходной таблицей.Например, вы можете синхронизировать две таблицы, вставляя, обновляя или удаляя строки в одной таблице на основе различий, обнаруженных в другой таблице.

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)  

В любом случае, это не выглядит хорошей идеейобновлять таблицу отверстий при каждом обновлении вида.

...