SQL Server 2012中的预定作业

J09*_*J09 7 sql sql-server jobs

我有一个与SQL Server中的预定作业有关的问题.好吧,我猜它与预定的作业并不完全相关,但实际上与SQL查询有关.

无论如何,我的数据库中有2个表Table_1和Table_2.

我希望每隔5分钟运行一次预定作业,这将使Table_1中的所有缺失记录更新Table_2.

例如,如果Table_1有3条记录:

1 ABC
2 PQR
3 XYZ
Run Code Online (Sandbox Code Playgroud)

和Table_2只有2条记录:

2 PQR
3 XYZ
Run Code Online (Sandbox Code Playgroud)

这项工作的作用是将记录"1 ABC"添加到Table_2:

2 PQR
3 XYZ
1 ABC
Run Code Online (Sandbox Code Playgroud)

我在预定作业的步骤中写的查询如下:

在我的代码表中名称不同所以请原谅:

Table_1 = [sfs_test].dbo.[Table_1],
Table_2 = [sfs_test2].dbo.[Table_1]

INSERT INTO [sfs_test2].dbo.[Table_1] (UserID, UserName)
SELECT UserID, UserName
FROM [sfs_test].dbo.[Table_1]
WHERE UserID NOT IN (SELECT DISTINCT UserID 
                         FROM [sfs_test2].dbo.[Table_1])
Run Code Online (Sandbox Code Playgroud)

现在,我面临的问题是,如果我更新/更改Table_1中的记录,就像我将记录的标识"1 ABC"更改为"4 ABC"一样

作业运行时,我在表2中获得以下记录

2 PQR
3 XYZ
1 ABC
4 ABC
Run Code Online (Sandbox Code Playgroud)

虽然我正在寻找以下输出:

2 PQR
3 XYZ
4 ABC
Run Code Online (Sandbox Code Playgroud)

我试图尽可能地解释我的情况.我是这个论坛的新手,所以,我很抱歉提出任何愚蠢的问题,或者不解释它.任何帮助表示赞赏

编辑:

谢谢所有的回复人!

我相信我没有提到Table_1的任何列都可以更新,同样应该反映在Table_2中.

@Jibin Balachandran的解决方案在仅更新UserID的情况下工作正常,但不能更改其他列的位置.

我想出了一个我自己的解决方案,并希望你的意见:

使用Right Join从表2中删除记录然后使用Left Join将Table_1中存在的记录插入Table_2是否有意义?

@Ranjana Gritmire我还没有尝试过你的解决方案.如果没有别的办法可以做到.谢谢 :)

小智 0

好吧,似乎新行正在表中插入,而不是更新旧记录,因为您编写的查询是 INSERT 语句。

INSERT INTO [sfs_test2].dbo.[Table_1] (UserID, UserName)
SELECT UserID, UserName
FROM [sfs_test].dbo.[Table_1]
WHERE UserID NOT IN (SELECT DISTINCT UserID 
                         FROM [sfs_test2].dbo.[Table_1])
Run Code Online (Sandbox Code Playgroud)

我的假设:我假设这里的 UserID 是 ABC。如果是,那么理想情况下根本不应该插入记录,因为您使用的 where 条件表明 UserID 不应该存在于表中(您要插入的表中)。

我的解决方案:您需要编写一个 IF 语句来检查 ID 是否出现在上一个表中。

如果 ID 出现,那么您需要使用 UPDATE 来更新值。

如果 ID 没有出现,那么您需要使用 INSERT 来插入值。

我希望我已经消除了你的疑虑。