In SQL server, wie kann ich Werte in Tabelle EXCEPT wiederholen Zeilen insert?

Ich schrieb ein Python-Skript, das eine Textdatei anschauen und SQL-Code erstellen würde, die data in eine Tabelle insert würde.

Es sah so aus:

insert into table1 (date, locid, personid, itemid, amounts) values (val11,val12,val13,val14,val15) ,(val21,val22,val23,val24,val25) 

Die data sind so strukturiert, dass für einen bestimmten Satz von Werten die ersten vier Spalten (date, locid, personid, itemid) , es wird höchstens eine Zeile sein.

Im Moment muss ich von Hand überprüfen, wenn ein Eintrag bereits in der Tabelle existiert und dann aus der Insert-statement entfernt wird.

Wie kann ich diese data in den DB eingeben, ohne manuell nach Wiederholungen zu suchen?

Erstellen Sie eine zweite Tabelle, table2, mit der DDL für nur die Spalten, die in Ihrem Insert beteiligt sind.

Machen Sie Ihre Einsätze in table2.

Dann renne:

 insert into table1 (date, locid, personid, itemid, amounts) select t2.* from table2 t2 join( select locid, personid, itemid, amounts from table2 except select locid, personid, itemid, amounts from table1) x on t2.locid = x.locid and t2.personid = x.personid and t2.itemid = x.itemid and t2.amounts = x.amounts 

Dann kannst du table2 löschen.

Und table1 wird mit nur den INSERTEN belegt, wo Werte in allen 4 Spalten keine Übereinstimmung mit allen 4 Spalten auf einer vorhandenen Zeile von table1 sind.

Dies setzt voraus, dass Sie nicht wollen, dass die INSERT nur durchlaufen wird, wenn es in allen 4 Spalten eine Übereinstimmung gibt. Mit anderen Worten, das oben wird das INSERT tun, wenn es eine Zeile gibt, in der 3 der 4 Spalten übereinstimmen. Es stoppt nur die INSERT, wenn es bereits eine Zeile gibt, die eine perfekte Übereinstimmung auf allen 4 Spalten ist.

Wenn Sie auch doppelte INSERT-statementen erstellt haben, fügen Sie einfach den DISTINCT-Operator zur Abfrage hinzu, "wählen Sie DISTINCT t2. * Aus table2 t2"

Wie ludwigmace in den Kommentaren darauf hingewiesen hat, vielleicht auch das folgende ausprobieren und die performancesunterschiede vergleichen, sollte es funktional gleichwertig sein (wenn die Einsätze keine Duplikate enthalten, können Sie die Gruppe befreien)

 insert into table1 (date, locid, personid, itemid, amounts) SELECT t2.date, t2.locid, t2.personid, t2.itemid, t2.amounts FROM table2 t2 LEFT JOIN t1 ON t2.date = t1.date AND t2.locid = t1.locid AND t2.personid = t1.personid AND t2.itemid = t1.itemid WHERE t1.date is null GROUP BY t2.date, t2.locid, t2.personid, t2.itemid, t2.amounts 

Das sollte funktionieren:

  INSERT INTO [table1] ([date], [locid], [personid], [itemid], [amounts]) SELECT val1, val2, val3, val4, val5 WHERE NOT EXISTS ( SELECT * FROM [table1] WHERE [date]=val1 AND [locid]=val2 AND [personid]=val3 AND [itemid]=val4 ) 

Anstatt Werte direkt einzufügen, fügen Sie aus dem Ergebnis einer select-statement ein. Die select-statement wird erstellt, um nur die Werte zurückzugeben, die Sie angeben, wenn sie noch nicht vorhanden sind

Sie können den scope der Einzigartigkeit steuern (die Kombination der Spalten sollte eindeutig sein), indem Sie die Where-Klausel in der zweiten Auswahl ändern (dh Vergleiche hinzufügen oder entfernen)