2012-03-26 16 views
2

Ich versuche, Daten in Tabelle einzufügen, aber wenn es bereits in der Tabelle vorhanden ist, sollte es nicht hinzufügen.
Dies ist der Code, was ich kam, aber es fügt immer noch mehrere Daten mit denselben Werten.
Wie nur einfügen, wenn nicht existiert

insert into nol_art_izm([ART_ID],[DAT]) 
    select distinct 
     v.id_art, {fn now()} 
    from 
     openxml(@hDoc, '/art_kompl/nol_voac') with #vc xd 
     inner join nol_voac v on xd.id_art = v.id_art 
    where 
     not exists(select * from nol_art_izm where nol_art_izm.art_id=xd.id_art) 


Ich möchte, dass es keine doppelten "ART_ID" Werte

+0

Fragen scheint mir in Ordnung. Erhalten Sie Duplikate im 'Select distinct' Teil? Meine Version von SQL Server erhält einmal den Wert von now(), aber ich bin mir nicht sicher, dass es immer der Fall ist. –

+0

@Nikola Er fügt doppelte "ART_ID" -Werte in die Tabelle ein – Brezhnews

+0

Sie könnten in diesem Fall eine 'GROUP BY v.id_art' in Erwägung ziehen und eine Aggregatfunktion für' {fn now()} '(zum Beispiel' max') wählen). – GolfWolf

Antwort

2

Versuchen

insert into nol_art_izm([ART_ID],[DAT]) 
    select distinct 
     v.id_art, {fn now()} 
    from 
     openxml(@hDoc, '/art_kompl/nol_voac') with #vc xd 
     inner join nol_voac v on xd.id_art = v.id_art 
     left join nol_art_izm n on n.art_id = v.id_art 
    where n.art_id is null 

Update:

Versuchen GROUP BY mit vermeiden doppelte id_art Werte :

insert into nol_art_izm([ART_ID],[DAT]) 
    select 
     v.id_art, MAX({fn now()}) 
    from 
     openxml(@hDoc, '/art_kompl/nol_voac') with #vc xd 
     inner join nol_voac v on xd.id_art = v.id_art 
    where 
     not exists(select * from nol_art_izm where nol_art_izm.art_id=xd.id_art) 
    group by v.id_art 

Bitte nicht, dass ich die MAX Funktion zur Aggregation der {fn now()} Werte gewählt haben (falls es mehr solche Werte pro id_art). Vielleicht möchten Sie eine andere Funktion verwenden.

+0

In unwahrscheinlichen Fällen könnte der Beitritt schlechter sein als der Semi-Join des OP, da das Risiko einer weiteren Datenduplikation besteht, wenn bereits Dubletten in "nol_art_izm.art_id" vorhanden sind. –

+0

@LukasEder Sie haben Recht damit. Ihre 'MERGE' Lösung sieht perfekt aus, danke fürs Teilen. +1 – GolfWolf

+0

arbeitete mit Gruppe von – Brezhnews

7

Hinweis: Diese Antwort wird nur mit SQL Server arbeiten 2008 ...

Verwenden Sie die MERGE Anweisung. Der Vorteil einer MERGE Aussage ist die Tatsache, dass es deutlich die Absicht ausdrückt, nur einfügen zu wollen, wenn es noch keine Übereinstimmung gibt. Für zukünftige Leser könnte dies hilfreich sein, da Alternativen mit INSERT .. SELECT ein bisschen schwieriger zu entziffern sind.

-- This is where you're "merging" data into 
MERGE INTO nol_art_izm dst 

-- This is your merge data source 
USING (
    -- Use DISTINCT here, to prevent possible duplicates from the below INNER JOIN 
    SELECT DISTINCT v.id_art 
    FROM openxml(@hDoc, '/art_kompl/nol_voac') with #vc xd 
    INNER JOIN nol_voac v on xd.id_art = v.id_art 
) src 

-- This is your "join" condition, used to decide whether to perform an 
-- INSERT or UPDATE 
ON (dst.art_id = src.id_art) 

-- When source and target don't match (see ON clause), perform an insert 
WHEN NOT MATCHED THEN INSERT ([ART_ID],[DAT]) 
    VALUES (src.id_art, {fn now()}) 

Diese Aussage lässt die WHEN MATCHED THEN UPDATE Klausel, da Sie nur daran interessiert sind INSERTs bei der Durchführung nicht UPDATEs

+0

Wenn ich Ihre Methode verwenden, zeigt es mir einen Fehler: "Msg 102, Ebene 15, Status 1, Prozedur INSERT_UPDATE_ARTIKULS_KOMPLEKTS_XML, Zeile 574 Falsche Syntax in der Nähe von 'MERGE'." Kann es nicht herausfinden warum. – Brezhnews

+0

@Brezhnews: "MERGE" wurde mit SQL Server 2008 eingeführt. Welche Version verwenden Sie? –

+0

Dann scheint das das Problem zu sein, da ich SQL Server 2005 verwende. Gibt es in SQL Server 2005 etwas Ähnliches? – Brezhnews

Verwandte Themen