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