2017-12-19 2 views
0

Ich habe in den letzten paar Wochen daran gearbeitet, eine 68GB-Tabelle in eine normalere Struktur zu zerlegen, und alles läuft reibungslos bis heute.Einfügung schlägt fehl, ausgewählte Daten einzufügen

ich mit dieser Abfrage ein paar ausgewählten Spalten aus dem großen Tisch in die neue Tabelle zu bewegen versucht bin:

insert into [destination] (col1, col2, col3...) 
select col1, col2, col3 
From [source] 
where companyID = [source].companyID 

ich die Nachricht erhalten, (60.113.678 Zeile (n) betroffen), aber die Daten waren nicht in das Ziel eingefügt, und die Daten in der Quelltabelle wurden nicht geändert, also was wurde betroffen, und warum wurde keine der Daten in das Ziel eingefügt?

+1

'Aber die Daten wurden nicht in das Ziel eingefügt. <= = Wie haben Sie das verifiziert? – Igor

+0

'where companyID = [Quelle] .companyID 'Sie versuchen, die Tabellen zu verbinden? – Sami

+0

Ihre 'WHERE'-Klausel macht gar nichts. Der Gültigkeitsbereich ist auf das SELECT beschränkt, so dass er die Tabelle "[Ziel]" nicht sehen kann, was bedeutet, dass er nur die Tabelle "[Quelle]" sehen kann. Daher wird die unqualifizierte 'companyID 'auf' [source] 'bezogen. Das gibt 'WHERE [Quelle] .companyID = [Quelle] .companyID', was ich bezweifle, dass du das machen willst? Könnten Sie bitte erklären, was es tun soll? Wie haben Sie außerdem bestätigt, dass keine Zeilen eingefügt wurden? Bitte zeigen Sie das vollständige Skript und die Ergebnisse an. etwas wie 'SELECT COUNT (*) FROM [Ziel]; EINFÜGEN ; SELECT COUNT (*) FROM [Ziel]; ' – MatBailie

Antwort

1

Der Code, den Sie scheinen zu wollen auszuführen ist:

update d 
    set col1 = s.col1, 
     col2 = s.col2, 
     col3 = s.col3 
    from destination d join 
     sources s 
     on s.companyID = s.companyId; 

Der Code, den Sie geschrieben haben, ist äquivalent zu:

insert into [destination] (col1, col2, col3...) 
    select s.col1, s.col2, s.col3 
    From [source] 
    where s.companyID = s.companyID; 

Die where entspricht s.companyID is not null. Daher haben Sie alle 60.113.678 Zeilen von source in neue Zeilen in destination eingefügt.

Offensichtlich ist eine Moral der Geschichte, den Unterschied zwischen insert und update zu verstehen. Noch wichtiger ist, qualifizieren alle Spaltennamen in einer Abfrage. Wenn Sie dies getan hätten, wäre Ihre Abfrage unter source.CompanyID = destination.CompanyId fehlgeschlagen - und Sie müssten nicht herausfinden, wie Sie 60.113.678 neue Zeilen löschen können.

+0

Vielen Dank für Ihre schnelle Antwort. Könnte ich fragen, warum Update statt einfügen? – Sluggish1

+0

@ Sluggish1 'wo companyID = [source] .companyID bedeutet, dass Sie ein' UPDATE' anstelle eines 'INSERT' benötigen – Sami

+0

@ Sluggish1. . . Weil Sie scheinbar vorhandene Zeilen ändern möchten, anstatt neue Zeilen einzufügen. –