SQL Server 2012中的预定作业

我有一个与SQL Server中的计划作业有关的问题。 那么,我想这与预定作业并不完全相关,但实际上与SQL查询有关。

无论如何,我有两个表Table_1和Table_2在我的数据库。

我希望每5分钟运行一次计划作业,以便将Table_2更新为来自Table_1的所有缺失记录。

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

1 ABC
2 PQR
3 XYZ

而Table_2只有2条记录:

2 PQR
3 XYZ

这项工作做的是将记录“1 ABC”添加到Table_2中:

2 PQR
3 XYZ
1 ABC

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

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

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])

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

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

2 PQR
3 XYZ
1 ABC
4 ABC

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

2 PQR
3 XYZ
4 ABC

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

编辑:

谢谢你们所有的回复!

我相信我没有提及Table_1的任何列可以更新,并且表2中应该反映相同的内容。

@Jibin Balachandran的解决方案在只有UserID更新的情况下工作正常,但没有其他列更改的地方。

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

使用Right Join删除Table_2中的记录并使用Left Join将Table_1中存在的记录插入到Table_2中是否合理?

@Ranjana Gritmire我还没有尝试过你的解决方案。 如果没有其他解决办法会做。 谢谢 :)


在插入新记录之前,您可以删除具有相同名称和不同ID的旧记录。

DELETE [sfs_test2].dbo.[Table_1] 
WHERE EXISTS (
               SELECT 1 
               FROM [sfs_test].dbo.[Table_1]
               WHERE [sfs_test].dbo.[Table_1].UserName=[sfs_test2].dbo.[Table_1]. UserName
               AND [sfs_test].dbo.[Table_1].UserID<>[sfs_test2].dbo.[Table_1].UserID )


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])

试试这个:(它会让你知道如何开始)

IF EXISTS(SELECT * FROM TABLE_1 WHERE ID NOT IN
            (SELECT ID FROM TABLE_2) AND VAL NOT IN (SELECT VAL FROM TABLE_2))
BEGIN
INSERT INTO TABLE_2 SELECT * FROM TABLE_1 WHERE ID NOT IN (SELECT ID FROM TABLE_2)
END

IF EXISTS(SELECT * FROM TABLE_1 WHERE ID NOT IN (SELECT ID FROM TABLE_2) 
            OR VAL NOT IN (SELECT VAL FROM TABLE_2))
BEGIN
UPDATE TABLE_2 SET ID=((SELECT ID FROM TABLE_1 WHERE ID 
                        NOT IN (SELECT ID FROM TABLE_2) 
                        OR VAL NOT IN (SELECT VAL FROM TABLE_2)))
        WHERE VAL=(SELECT VAL FROM TABLE_1 WHERE ID
         NOT IN (SELECT ID FROM TABLE_2) OR VAL NOT IN (SELECT VAL FROM TABLE_2))
END


SELECT * FROM TABLE_2

DECLARE @TAB AS TABLE (Id int, Duplicate varchar(20))

INSERT INTO @TAB 
SELECT 1, 'ABC' UNION ALL
SELECT 2, 'ABC' UNION ALL
SELECT 3, 'LMN' UNION ALL
SELECT 4, 'XYZ' UNION ALL
SELECT 5, 'XYZ'

DELETE FROM @TAB WHERE Id IN (
SELECT Id FROM (
    SELECT 
        Id
        ,ROW_NUMBER() OVER (PARTITION BY [Duplicate] ORDER BY Id) AS [ItemNumber]
        -- Change the partition columns to include the ones that make the row distinct
    FROM 
        @TAB 
) a WHERE ItemNumber > 1 -- Keep only the first unique item
)
链接地址: http://www.djcxy.com/p/37327.html

上一篇: scheduled jobs in SQL Server 2012

下一篇: Android: Audio Matching (Audio Fingerprinting)