2016-12-05 25 views
7

SQL Serverでスケジュールされたジョブに関する質問があります。まあ、それはスケジュールされた仕事とは正確には関係ないと思いますが、実際にはSQLクエリに関連しています。SQL Server 2012のスケジュールされたジョブ

とにかく私のデータベースには2つのテーブルTable_1とTable_2があります。

5分ごとにスケジュールされたジョブを実行して、Table_2のすべての不足レコードをTable_2に更新したいとします。

1 ABC 
2 PQR 
3 XYZ 

とTable_2のみ2レコードがあります:

2 PQR 
3 XYZ 

何の仕事がないことである

がTable_2にレコード "1 ABC" を追加します。

を例えば

はTABLE_1は3つのレコードを持っている場合

2 PQR 
3 XYZ 
1 ABC 

スケジュールされたジョブの手順で作成したクエリは、次のとおりです。

01私のコードのテーブル名で

が異なっているので、私に言い訳してください:

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

、私が直面してる問題は、私は更新した場合、私はのIDを変更した場合/のようにtable_1のレコードを変更することです

:「4 ABC」の仕事は、私は次のような出力を探していますが、私はTable_2

2 PQR 
3 XYZ 
1 ABC 
4 ABC 

に次のレコードを取得する実行し

にレコード「1 ABC」

2 PQR 
3 XYZ 
4 ABC 

私は自分の状況についても説明できるように努力しました。私はこのフォーラムには新しいので、愚かな質問をしたり、それをうまく説明しなかったことに対する私の謝罪。 すべてのヘルプは

を高く評価している

EDIT:

は、すべての応答のみんなありがとう!

私は、Table_1のどの列も更新でき、同じことがTable_2に反映される必要があると言及していないと思います。

@Jibin Balachandranのソリューションは、UserIDのみが更新されていて、他の列が変更されていない場所ではうまく動作します。

私は自分の溶液を作ってみたし、あなたの意見をしたいと思います:

それが右に参加してから、左を使用して使用してTable_2からレコードを削除するために理にかなってTABLE_1に存在するレコードを挿入入会Table_2に?

@Ranjana Gritmire私はまだ解決策を試していません。それ以外の何ものがうまくいかない場合はやります。ありがとうございました:)

+0

スケジュールすることができ、私は削除あなたの質問はSQL Serverに関するものなので、MySQLタグ。 –

+0

すべての編集に感謝します。はるかにきれいに見えます:) – J09

+0

だから、ちょうど1つの 'ABC'がほしいと思って、もう1つを削除してください。 – Sami

答えて

0

よく書いたクエリがINSERT文であるため、古いレコードを更新するのではなく、新しい行がINSERTEDされているようです。

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

私の仮定:私はここにユーザーIDがABCであると仮定しています。それが理想的であれば理想的には、あなたがテーブルに存在してはならないwhere条件(挿入しようとしている)を使用しているときにレコードを挿入するべきではありません。

私の解決策:IDが上記の表にあるかどうかを確認するIF文を書く必要があります。

IDが発生した場合は、UPDATEを使用して値を更新する必要があります。

IDが発生しない場合は、INSERTを使用して値をINSERTする必要があります。

私はあなたの疑いを明確にしたいと思います。

+0

ここのユーザーIDは数字です。最初の列。あなたの努力に感謝します。 :) – J09

1

新しいレコードを挿入する前に、同じ名前と異なる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]) 
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 
1
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 
) 
0
DELETE FROM sfs_test2.dbo.Table_2 
    WHERE sfs_test2.dbo.Table_2.UserID = 
     (select sfs_test2.dbo.Table_2.UserID 
     from sfs_test.dbo.Table_1 
     right join sfs_test2.dbo.Table_2 
     on sfs_test.dbo.Table_1.UserID = sfs_test2.dbo.Table_2.UserID 
     and sfs_test.dbo.Table_1.UserName = sfs_test2.dbo.Table_2.UserName 
     where sfs_test.dbo.Table_1.UserID IS NULL 
     and sfs_test.dbo.Table_1.UserName IS NULL) 
     AND sfs_test2.dbo.Table_2.UserName = 
     (select sfs_test2.dbo.Table_2.UserName 
     from sfs_test.dbo.Table_1 
     right join sfs_test2.dbo.Table_2 
     on sfs_test.dbo.Table_1.UserID = sfs_test2.dbo.Table_2.UserID 
     and sfs_test.dbo.Table_1.UserName = sfs_test2.dbo.Table_2.UserName 
     where sfs_test.dbo.Table_1.UserID IS NULL 
     and sfs_test.dbo.Table_1.UserName IS NULL) 

INSERT INTO [sfs_test2].dbo.[Table_2] (UserID, UserName) 
SELECT sfs_test.dbo.Table_1.UserID, sfs_test.dbo.Table_1.UserName 
FROM [sfs_test].dbo.[Table_1] 
WHERE UserID NOT IN (SELECT DISTINCT UserID 
         FROM [sfs_test2].dbo.[Table_2]) 

あなたたちはこのソリューションについてどう思いますか?

これはNickの第1の提案とまったく同じではないと思います!

私の代わりにこれを試してみましたが、所望の出力を得た:

DELETE FROM sfs_test2.dbo.Table_2 
    WHERE sfs_test2.dbo.Table_2.UserID IN 
     (select sfs_test2.dbo.Table_2.UserID 
     from sfs_test.dbo.Table_1 
     right join sfs_test2.dbo.Table_2 
     on sfs_test.dbo.Table_1.UserID = sfs_test2.dbo.Table_2.UserID 
     and sfs_test.dbo.Table_1.UserName = sfs_test2.dbo.Table_2.UserName 
     where sfs_test.dbo.Table_1.UserID IS NULL 
     and sfs_test.dbo.Table_1.UserName IS NULL) 

     AND sfs_test2.dbo.Table_2.UserName IN 
     (select sfs_test2.dbo.Table_2.UserName 
     from sfs_test.dbo.Table_1 
     right join sfs_test2.dbo.Table_2 
     on sfs_test.dbo.Table_1.UserID = sfs_test2.dbo.Table_2.UserID 
     and sfs_test.dbo.Table_1.UserName = sfs_test2.dbo.Table_2.UserName 
     where sfs_test.dbo.Table_1.UserID IS NULL 
     and sfs_test.dbo.Table_1.UserName IS NULL) 

INSERT INTO [sfs_test2].dbo.[Table_2] (UserID, UserName) 
SELECT sfs_test.dbo.Table_1.UserID, sfs_test.dbo.Table_1.UserName 
FROM [sfs_test].dbo.[Table_1] 
WHERE UserID NOT IN (SELECT DISTINCT UserID 
         FROM [sfs_test2].dbo.[Table_2]) 
+0

更新するレコードが複数ある場合はうまくいかないため、これは失敗の解決策です。 ** 1 **レコードを更新する場合にのみ機能します。 – J09

+0

最初の部分についてはわかりませんが、2番目の部分では 'UserID'がキーであると仮定しています。あなたは以前にこれが当てはまらないことを示しました。たとえば、誰かがUserIDをAからBに更新すると、このINSERTは新しいレコードであるかのようにBレコードを挿入します。主キーはデータベースで非常に重要です。さらに進める前に、今すぐ定義できるかどうか検討する必要があります。あなたができるならば、このエクササイズは簡単です。 –

+0

はるかに簡単な解決策に加えて、多くを削除してリロードするだけです。あなたがそれをしたくない理由は何ですか? –

0

まずあなたがテーブルの上に1

 
CREATE TRIGGER trgAfterupdate ON [sfs_test].dbo.[Table_1] 
FOR update 
AS 
    declare @empid int; 
    declare @empname varchar(30); 
    select @empid=i.UserID from inserted i; 
    select @empname=i.UserName from inserted i; 
    if update(UserID) 
    UPDATE [sfs_test2].dbo.[Table_1] SET [email protected] WHERE [email protected] 
    if UPDATE(UserName) 
    UPDATE [sfs_test2].dbo.[Table_1] SET [email protected] WHERE [email protected] 
GO 

をトリガーを作成し、その後、あなたのクエリ

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