2013-03-11 20 views
6

Was ich versuche zu tun ist, eine Tabelle mit einer anderen temporären Tabelle zu vergleichen, und wenn der Datensatz noch nicht existiert, fügen Sie ihn in die Tabelle ein. Mein Problem ist das IF NICHT EXIST scheint nicht korrekt zu sein. Wenn ich den Code auseinander ich habe das Problem ziehen ist:SQL Einfügen Datensatz, wenn nicht existiert

29 Ergebnisse Returns:

SELECT * 
from NO_STOCK INNER JOIN #no_stock 
    ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE 
WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE. 

Dies lieferte keine Ergebnisse (ich würde erwarten, dass diese 34 zurück):

SELECT PRODUCT_CODE 
FROM #no_stock 
WHERE NOT EXISTS 
    (SELECT * from NO_STOCK INNER JOIN #no_stock 
    ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE 
    WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 

Diese Erträge 63:

SELECT PRODUCT_CODE 
FROM #no_stock 
WHERE EXISTS 
    (SELECT * from NO_STOCK INNER JOIN #no_stock 
    ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE 
    WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 

ps. Verwendung von SQL Server 2008 R2

Antwort

6

sein sollte Schrotte deine inneren Joins in deinen Unterabfragen.

Was Sie versuchen sollte, ist die folgende:

SELECT PRODUCT_CODE FROM #no_stock 
WHERE NOT EXISTS (SELECT * from NO_STOCK 
       WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 

Sie benötigen keine innere brauchen dich hier, weil die #no_stock Tabelle in der äußeren Abfrage verwiesen wird.

Das gleiche gilt für die anderen Abfrage:

SELECT PRODUCT_CODE FROM #no_stock 
WHERE EXISTS (SELECT * from NO_STOCK 
      WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 

diese versuchen und sehen, ob sie funktionieren.

0

Statt NICHT vorhanden ist, versuchen diese

WHERE Product_Code NOT IN (SELECT Product_Code FROM NO_STOCK INNER JOIN #no_stock ON NO_STOCK.PRODUCT_CODE #no_stock.PRODUCT_CODE WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 
+0

Warum würde das besser funktionieren als NOT EXISTS? –

+0

Danke das hat sehr geholfen !! Kann IN nicht in einer Situation benutzt werden, in der ich auch Datum überprüfen möchte? Also nur einfügen, wenn Produktcode und Datum nicht mit aktuellem Datum im selben Datensatz existieren? – user2158168

+0

Nein, NOT IN vergleicht den Wert eines Elements mit dem Ergebnis einer SELECT-Anweisung, bei der eine Spalte zurückgegeben wird. Wenn Sie die Existenz mehrerer Werte überprüfen müssen, gehen Sie besser zurück zu NOT EXISTS – Melanie

0

versuchen ...

SELECT PRODUCT_CODE FROM #no_stock 
WHERE NOT EXISTS (SELECT * from NO_STOCK INNER JOIN #no_stock 
        ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 
2

Sie brauchen nicht beide vorhanden und innere Verknüpfung im Falle Ihrer product_code Datensätze in beide definiert Tabellen. So

Ich nehme an, Sie temporäre Tabelle als Referenz verwenden und das Hinzufügen von Datensatz-Tabelle aus temporärer Tabelle nur für den Fall, es existiert nur in temporärer Tabelle

So Ihre Abfrage so etwas wie

insert into no_stock 
select * from #no_stock 
where product_code not in (select product_code from no_stock) 
Verwandte Themen