SQL Server 如何更改我的视图,使其在插入表时不会产生重复?

Posted

技术标签:

【中文标题】SQL Server 如何更改我的视图,使其在插入表时不会产生重复?【英文标题】:SQL Server How do I change my view so it doesn't produces duplicates when inserting into a table? 【发布时间】:2018-12-14 14:18:07 【问题描述】:

我有意见

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] 而不是也不产生重复?

【问题讨论】:

您的“视图”不会生成重复项——根本不会——无论对视图本身运行什么查询。问题在于您未显示的触发器中的代码。此外,插入依赖于 Employee 的表(即,应该有一个从您的 Form 表到 Employee 的外键)的想法没有什么意义。这听起来像 XY problem 【参考方案1】:

您正在寻找Merge

根据与源表连接的结果对目标表执行插入、更新或删除操作。例如,您可以通过根据在另一个表中发现的差异在一个表中插入、更新或删除行来同步两个表。

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)  

无论如何,在每次视图更新时更新孔表似乎都不是一个好主意。

【讨论】:

【参考方案2】:

试试这个查询

 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/

【讨论】:

它给了我一个错误“关键字'BY'附近的语法不正确。” 你现在可以试试吗 不同的错误“消息 207,级别 16,状态 1,第 3 行无效的列名称 'employeeid'。消息 207,级别 16,状态 1,行 3 无效的列名称 'employeeno'。”跨度> 我想我的表名是 LWEmployees 而不是Employees。我接受我只是改变它? 尝试在表格和视图中使用适当的列名,我已经从上面复制了列名。

以上是关于SQL Server 如何更改我的视图,使其在插入表时不会产生重复?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改我的 C++ 代码以使其在 C 中可用?

用前导零填充字符串,使其在 SQL Server 2008 中的长度为 3 个字符

如何以编程方式从控件自己的更改事件中更改选择框选择并使其在移动浏览器中工作

UITableView,如何修复页脚,使其在滚动时永远不会向上或向下移动?

更改 UILabel 的文本使其在使用 UIViewKeyframeAnimations 时重新出现

列值更改的 T-SQL (SQL Server 2016) 触发器,在插入