2017-02-22 2 views
0

Ich arbeite mit T-SQL. Ich habe zwei Tabellen: Fullname und SSN-Tabelle. Die SSN-Tabelle enthält über 10000 Datensätze mit einem Vornamen, einem Nachnamen und einer ssn-Spalte. Fullname-Tabelle hat 100 Datensätze mit Vor- und Nachname.T-SQL - alle Zeilen aktualisieren, auch wenn Daten wiederholt werden

Ich möchte SSN Tabelle mit den Vornamen und Nachnamen Datensätze von Fullname zu aktualisieren. Am Ende der 100 Datensätze möchte ich nur die Namen wiederholen (beginnend mit Zeile 1 des vollständigen Namens), bis alle Einträge in der SSN-Tabelle fertig sind. Ich habe versucht, eine MERGE wie folgt, aber bekam eine 'Die MERGE-Anweisung versucht, die gleiche Zeile mehr als einmal zu aktualisieren oder zu löschen' Fehlermeldung. In diesem Code habe ich versucht, die Spalte [Nachname] zuerst zu aktualisieren. Kannst du mir bitte helfen? Vielen Dank.

MERGE INTO [SSN] 
    USING [fullname] 
     ON 1=1 
    WHEN MATCHED THEN 
    UPDATE 
     SET [last name] = [fullname].[last name]; 
+1

So zu klären: (1) Sie kümmern sich nicht um DENEN Namen, dem SSN zugeordnet ist, aber Sie wollen eher eine Rotation der 100 Namen verwenden, als nur einen einzigen Namen, nicht wahr? (2) Haben die Tabellen sequentielle ID-Spalten? –

+0

(1) Nein, das spielt keine Rolle. Es gibt keinen mit SSN übereinstimmenden Namen. Dies werden alle Testdaten sein. (2) Nur SSN hat sequentielle ID-Spalten, aber ich kann bei Bedarf die sequenzielle ID zur Tabelle mit dem vollständigen Namen hinzufügen. – ray500

+0

Bitte sagen Sie mir, dass Sie die SSN nicht im Klartext speichern. Ich weiß, dass Sie Testdaten generieren, aber SSN muss immer verschlüsselt sein. –

Antwort

1

UPDATE - Korrekturen und Erklärungen

Wenn beide Tabellen sequenzielle IDs haben, dann können Sie Ihre ON Klausel

ON [fullname].[ID] = [SSN].[ID] % 100 

Die Idee ist, für jeden [SSN].[ID] ändern müssen Sie Wählen Sie genau eine [fullname].[ID], und der % (Integer Division Rest oder Modulo) -Operator gibt uns eine Möglichkeit, dies zu tun, jedeauswählennehmen ungefähr die gleiche Anzahl von Malen auf.

fullname 0 matches SSN 0, 100, 200, 300, ... 
fullname 1 matches SSN 1, 101, 201, 301, ... 

Denn es ohne irgendwelche Lücken zu arbeiten, müssen Sie [fullname] Datensätze mit jedem [ID] Wert von 0 bis 99. Wenn die erste [ID] 1 ist, können Sie diese

ON [fullname].[ID] = ([SSN].[ID] % 100) + 1 

unter der Annahme sagen anpassen Sie haben einen [fullname] Datensatz mit [ID] von 100. Wenn Sie eine andere Anzahl von insgesamt [fullname] Datensätze haben, können Sie die Nummer nach der % ändern.

+0

Wenn es ein Problem ist, eine fehlende ID hinzuzufügen, * können * Sie * mit * row_number() over() '; aber ich bin skeptisch (und nicht in der Lage, Tests jetzt zu starten) –

+0

Danke, ich werde das versuchen, aber wird es alle 10000+ Zeilen aktualisieren? – ray500

+0

Danke Mark, das hat auch funktioniert. – ray500

1

Sie könnten dies mit einer Update-Anweisung in diesen Zeilen tun. Dies setzt voraus, dass in ssnTable.RowNumber (oder was auch immer Ihr tatsächlicher Name ist) keine Lücken vorhanden sind. Wenn Sie Lücken haben, ist es ein ziemlich einfacher Schritt, RowNumber auch dort zu verwenden.

update s 
set LastName = fn.FullName 
from ssnTable s 
join 
(
    select ROW_NUMBER() over(order by LastName) as RowNum 
     , LastName 
    from FullName 
) fn on fn.RowNum = s.RowNumber % 100 
+0

Danke Sean, das hat funktioniert! – ray500

Verwandte Themen