Sql server 通过重复检查选择“不同”

Sql server 通过重复检查选择“不同”,sql-server,tsql,Sql Server,Tsql,我有以下代码 INSERT INTO [dbo].[Employees_Dim] ([EmpNo], [EmpName]) SELECT DISTINCT st.[EmpNo], [EmpName] FROM [dbo].[EEMasterData] st 我想从主表中取出两列来创建Employee维度。 对于来自此主表的其他维度,这将重复 我希望能够在SSIS包中运行该脚本,该包将查看主数据、引用Employee_Dim并仅根据员工编号添加新员工 我知道我错过了什么只是不知道什么 更新:我的

我有以下代码

INSERT INTO [dbo].[Employees_Dim] ([EmpNo], [EmpName])
SELECT DISTINCT st.[EmpNo], [EmpName]
FROM [dbo].[EEMasterData] st
我想从主表中取出两列来创建Employee维度。 对于来自此主表的其他维度,这将重复

我希望能够在SSIS包中运行该脚本,该包将查看主数据、引用Employee_Dim并仅根据员工编号添加新员工

我知道我错过了什么只是不知道什么

更新:我的问题是,我应该在上面的脚本中添加什么,只将EEMasterData表中新添加的员工插入EmployeeDim,使用EmpNo作为键

。。。并且只添加新员工

如果这是您面临的问题,请仅选择维度表中不存在的条目:

INSERT INTO [dbo].[Employees_Dim] ([EmpNo], [EmpName])
SELECT DISTINCT st.[EmpNo], [EmpName]
FROM [dbo].[EEMasterData] st
WHERE st.[EmpNo] NOT IN (SELECT EmpNo FROM Employees_Dim)
假设EmpNo对于每个员工都是唯一的

。。。并且只添加新员工

如果这是您面临的问题,请仅选择维度表中不存在的条目:

INSERT INTO [dbo].[Employees_Dim] ([EmpNo], [EmpName])
SELECT DISTINCT st.[EmpNo], [EmpName]
FROM [dbo].[EEMasterData] st
WHERE st.[EmpNo] NOT IN (SELECT EmpNo FROM Employees_Dim)

假设EmpNo对每个员工都是唯一的

我们也一样:那么你的问题是什么?对不起,我正赶着把这个加进去。我更新了上面的问题。我们也没有:那么你的问题是什么?对不起,我正赶着把这个加进去。我更新了上面的问题。正确,EmpNo对每个员工都是唯一的。我会试试这个,我想这就是我想要的。谢谢。如果您使用的是SQL Server 2008或更高版本(可能是2005年),则在不存在的地方选择“1”会更快。如果您使用的是SQL Server 2008或更高版本,请选择“1”。@tommy\u o:您确定=您测量过这个吗?如果Employees_Dim.EmpNo和st.EmpNo都不可为空,那么这两个版本在语义上是等价的。那么,为什么查询优化器应该为它们选择不同的执行计划呢?@Heinzi:是的,在我们的实践中,我们已经看到了可衡量的改进,尤其是在大数据方面。虽然在某些条件下它可能变得等价,但如果查询变得或变得更复杂,选择“不存在”几乎总是更有效;价值观变化;等等,对于dim来说,这两种方式可能都不重要:啊,我还假设st.EmpNo可能为空。OP没有声明不可为null,我也不知道dbo.EEMasterData表包含什么。正确,EmpNo对于每个员工都是唯一的。我会试试这个,我想这就是我想要的。谢谢。如果您使用的是SQL Server 2008或更高版本(可能是2005年),则在不存在的地方选择“1”会更快。如果您使用的是SQL Server 2008或更高版本,请选择“1”。@tommy\u o:您确定=您测量过这个吗?如果Employees_Dim.EmpNo和st.EmpNo都不可为空,那么这两个版本在语义上是等价的。那么,为什么查询优化器应该为它们选择不同的执行计划呢?@Heinzi:是的,在我们的实践中,我们已经看到了可衡量的改进,尤其是在大数据方面。虽然在某些条件下它可能变得等价,但如果查询变得或变得更复杂,选择“不存在”几乎总是更有效;价值观变化;等等,对于dim来说,这两种方式可能都不重要:啊,我还假设st.EmpNo可能为空。OP没有声明不可为null,我也不知道dbo.EEMasterData表包含什么。