2016-11-11 11 views
-1

Ich habe hier eine Liste von 100 Arten von Artikel Geschmack. Dann habe ich einen Tisch, wo ich für jeden Gegenstand in jedem Geschmack einen Rekord brauche. Also, wenn ich 50 Artikel habe, brauche ich 100 Datensätze für jeden der 50 Artikel in dieser Tabelle_A. also wird es am Ende insgesamt 100x50 Datensätze in dieser Tabelle geben.SQL-Server - einfügen, wenn nicht vorhanden, sonst Update

Was ich jetzt habe, ist eine zufällige Mischung von Daten und ich weiß, dass ich keinen Datensatz für jede Art von Geschmack für jeden Artikel habe.

Wofür ich Hilfe brauche, ist eine Idee/ein Algorithmus, um dieses Problem zu lösen. Pseudo-Code würde tun. Ich habe einen Tisch mit allen möglichen Geschmacksrichtungen (tbl_flavor) und eine Tabelle mit allen 50 Artikeln (tbl_items). Diese beiden werden diktieren, was in Tabelle A eingegeben werden muss, was im Grunde ein Inventar ist.

Bitte beraten.

+0

Können Sie Ihre Frage mit dem Code, den Sie bisher haben, aktualisieren? Es ist einfacher zu helfen, wenn wir sehen, was Sie bisher versucht haben und wo genau Sie stecken geblieben sind. – Brian

+0

Mit CTE als (Wählen Sie A. *, B. * von einem Cross-Join B) Einfügen in FinalTable Wählen Sie * aus CTE, wo CTE.Key nicht existiert (Select Key from FinalTable) der Cross-Join gibt Ihnen einen vollständigen Satz der 50 * die 100. Die Nicht-Ausgänge werden alle diejenigen ausschließen, die Sie bereits in der Tabelle haben. Oder einfacher, löschen Sie einfach alles aus der Tabelle und fügen Sie alles aus dem Cross-Join ein (es sei denn, Sie müssen andere Attribute erhalten). – xQbert

+0

Verwenden Sie die Merge-Klausel. –

Antwort

1

Versuchen Wenn ich deine Frage richtig bin zu verstehen, wird eine SQL Server EXCEPT Abfrage helfen.

Wie bereits in den Kommentaren aus, hier ist, wie die Matrix der Elemente und Aromen zu erhalten:

SELECT Items.Item, Flavors.Flavor 
FROM Items 
CROSS JOIN Flavors 

Hier ist, wie die Matrix der Elemente und Aromen zu erhalten, die Kombinationen unterlassen, was bereits in der anderen sind Tabelle.

SELECT Items.Item, Flavors.Flavor 
    FROM Items 
    CROSS JOIN Flavors 
EXCEPT SELECT Item, Flavor 
    FROM Table_A 

So ist die INSERT wird:

INSERT INTO Table_A (Item, Flavor) 
SELECT Items.Item, Flavors.Flavor 
    FROM Items 
    CROSS JOIN Flavors 
EXCEPT SELECT Item, Flavor 
    FROM Table_A 

Diese Abfrage nicht getestet, weil ich über die Frage nicht zu 100% sicher bin. Wenn Sie mehr Details veröffentlichen, werde ich es testen.

+0

Danke. Das spricht genau das an, was ich wollte. – Eclipse

+0

Ich habe ein Problem mit der Abfrage. Wenn ich Folgendes versuche, scheitert es mit einer Fehlermeldung: Alle Abfragen, die mit einem UNION-, INTERSECT- oder EXCEPT-Operator kombiniert werden, müssen die gleiche Anzahl an Ausdrücken haben. ....... in table_A einfügen (flavor_id, prod_id, available_qty, lastupdated, lastupdatedby) \t auswählen fla.flavor_id, sp.product_id, 200, GETDATE() 'User1' \t von Flavors fla \t \t Quer verbinden sp Produkte \t wo sp.product_cd in (select product_cd von list_products) \t und fla.flavor_id in (fla_value von tblX auswählen, in dem fla_value = 'Y') \t außer wählen pl.flavor_id, pl.product_id von table_A pl – Eclipse

+0

in meinem insert, ich muss mindestens eine lastupdated bereitstellen. Jetzt ist das Problem, wenn ich ein zusätzliches Feld in meiner Auswahl und außer hinzufügen, wird es mir falsche Ergebnismenge erhalten. Irgendwelche Vorschläge? – Eclipse

1

Es gibt ein paar Möglichkeiten, wie Sie diese Art von Problem lösen können. Hier ist pseudedocode für eine dieser Möglichkeiten.

Update table 
set Col1 = SomeValue 
where MyKeys = Mykeys 

if (@@ROWCOUNT = 0) 
begin 
    Insert table 
    (Cols) 
    Values 
    (Vals) 
end 

Oder Sie können MERGE verwenden. https://msdn.microsoft.com/en-us/library/bb510625.aspx

+0

Merge ist jedoch schwer zu beheben, wenn Sie einen Fehler haben. Ich bevorzuge die Update-Insert-Methode. Und es ist wichtig, das Update vor dem Einfügen durchzuführen, um sowohl das Einfügen als auch das Aktualisieren der neuen Datensätze zu vermeiden. – HLGEM

+0

Einverstanden. Obwohl es der Ansatz des "alten Stils" ist, finde ich es viel einfacher, damit umzugehen. –

0

Diese

UPDATE MyTable 
     SET 
     ColumnToUpdate = NewValue 
     WHERE EXISTS 
     (
      SELECT 
       1 
       FROM TableWithNewValue 
        WHERE ColumnFromTable1 = MyTable.ColumnName 
     ) 

INSERT INTO MyTable 
(
    Column1, 
    Column2, 
    ... 
    ColumnN 
) 
SELECT 
    Value1, 
    Value2, 
    ... 
    ValueN 
    FROM TableWithNewValue 
     WHERE NOT EXISTS 
     (
      SELECT 
       1 
       FROM MyTable 
        WHERE ColumnName = TableWithNewValue.ColumnFromTable1 
     ) 
Verwandte Themen