2016-12-05 1 views
7

Ich habe eine Frage zu geplanten Jobs in SQL Server. Nun, ich denke, es hängt nicht genau mit geplanten Jobs zusammen, sondern mit SQL-Abfragen.geplante Aufträge in SQL Server 2012

Wie auch immer ich habe 2 Tabellen Table_1 und Table_2 in meiner Datenbank.

Ich möchte alle 5 Minuten einen geplanten Job ausführen, der Table_2 mit allen fehlenden Datensätzen aus Table_1 aktualisiert.

Zum Beispiel, wenn Table_1 hat 3 Datensätze:

1 ABC 
2 PQR 
3 XYZ 

und table_2 hat nur 2 Datensätze:

2 PQR 
3 XYZ 

Was die Arbeit erledigt ist fügt den Datensatz "1 ABC" zu table_2:

Die Abfrage, die ich in den Schritten des geplanten Jobs geschrieben habe, lautet wie folgt:

In meinem Code Tabellennamen unterschiedlich sind, so mich bitte entschuldigen:

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

Nun ist das Problem, das ich mit Blick auf bin, wenn ich wie in einem Datensatz in Table_1 aktualisieren/ändern, wenn ich die ID der Änderung record "1 ABC" bis "4 ABC"

Wenn der Auftrag ausgeführt wird ich die folgenden Datensätze in table_2

2 PQR 
3 XYZ 
1 ABC 
4 ABC 

erhalten Während ich für die folgende Ausgabe freu:

2 PQR 
3 XYZ 
4 ABC 

Ich habe versucht, meine Situation so gut wie möglich zu erklären. Ich bin neu in diesem Forum, also entschuldige ich mich dafür, irgendeine dumme Frage gestellt zu haben oder sie nicht gut zu erklären. Jede Hilfe ist

geschätzt

EDIT:

Vielen Dank für die Antworten Jungs!

Ich glaube, ich habe nicht erwähnt, dass jede Spalte von Tabelle_1 aktualisiert werden kann und das gleiche sollte in Tabelle_2 widerspiegeln.

@Jibin Balachandrans Lösung funktioniert gut, wenn nur die Benutzer-ID aktualisiert wird, aber nicht dort, wo andere Spalten geändert werden.

Ich habe mit einer Lösung aus meiner eigenen kommen und würde Ihre Meinung mag:

wäre es sinnvoll, die Datensätze aus table_2 löschen rechts Join und dann links mit Verwendung von Join die Datensätze einzufügen, die in Table_1 existieren in Tabelle_2?

@Ranjana Gritmire Ich habe deine Lösung immer noch nicht ausprobiert. Werde tun, wenn nichts anderes klappt. Danke :)

+0

ich die entfernt MySQL-Tag seit Ihrer Frage über SQL Server. –

+0

danke für alle Änderungen, Leute! Sieht viel sauberer aus :) – J09

+0

Also willst du nur ein 'ABC' und lösche das zweite – Sami

Antwort

0

Nun, es scheint, dass eine neue Zeile INSERTED in Ihrer Tabelle statt UPDATE der alte Datensatz als die Abfrage, die Sie geschrieben haben, ist eine INSERT-Anweisung.

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

Meine Vermutung: Ich gehe davon aus, dass die Benutzer-ID ist hier ABC. Wenn dies der Fall ist, sollte der Datensatz idealerweise nicht eingefügt werden, da Sie eine where-Bedingung verwenden, dass die Benutzer-ID nicht in der Tabelle vorhanden sein sollte (in die Sie einfügen möchten).

Meine Lösung: Sie benötigen eine IF-Anweisung zu schreiben, die überprüfen, ob die ID in der vorherigen Tabelle auftritt oder nicht.

Wenn die ID auftritt, müssen Sie die Werte mit einem UPDATE aktualisieren.

Wenn die ID nicht auftritt, müssen Sie die Werte mit einem INSERT einfügen.

Ich hoffe, ich habe Ihre Zweifel beseitigt.

+0

UserID hier sind die Zahlen. Die erste Spalte.Danke für Ihre Bemühungen. :) – J09

1

Sie können den alten Datensatz mit demselben Namen und einer anderen ID löschen, bevor Sie den neuen Datensatz einfügen.

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

Versuchen Sie folgendes: (Es wird Ihnen Vorstellung darüber, wie zu starten)

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

Was denken Sie Kerle über diese Lösung?

Ich denke, das ist nah, wenn nicht genau das Gleiche wie Nicks erster Vorschlag!

habe ich versucht, diese Stelle und bekam die gewünschte Ausgabe:

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

OK, dies ist eine fehlgeschlagene Lösung, da es nicht funktioniert, wenn mehrere Datensätze zu aktualisieren sind. Es funktioniert nur, wenn ** ein ** Datensatz aktualisiert werden soll. – J09

+0

Ich bin mir nicht sicher über den ersten Teil, aber der zweite Teil geht davon aus, dass 'UserID' der Schlüssel ist. Sie haben zuvor angegeben, dass dies nicht der Fall ist. Wenn beispielsweise jemand die Benutzer-ID von A nach B aktualisiert, fügt dieser INSERT den B-Datensatz ein, als wäre es ein neuer Datensatz. Primärschlüssel sind in einer Datenbank sehr wichtig. Bevor Sie weiter gehen, sollten Sie überlegen, ob Sie jetzt einen definieren können. Wenn Sie können, dann ist diese Übung trivial. –

+0

Neben einer viel einfacheren Lösung ist einfach löschen und neu laden. Irgendein Grund, warum du das nicht willst? –

0

Zuerst Trigger auf Tabelle erstellen 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 

dann können Sie Ihre Abfrage geplant

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