2013-03-11 53 views
6

Điều tôi đang cố gắng làm là so sánh bảng với một bảng tạm thời khác và nếu bản ghi chưa tồn tại, hãy chèn nó vào bảng. Vấn đề của tôi là IF NOT EXIST dường như không chính xác. Nếu tôi kéo mã ngoài vấn đề tôi có là:Chèn SQL bản ghi nếu không tồn tại

Trả 29 kết quả:

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. 

này trả về không có kết quả (Tôi mong chờ này để trả lại 34):

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) 

lợi nhuận này 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. sử dụng SQL Server 2008 R2

Trả lời

6

Phế liệu tham gia bên trong của bạn trong truy vấn phụ của bạn.

Những gì bạn cần phải cố gắng như sau:

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

Bạn không cần một bên tham gia ở đây vì bảng #no_stock được tham chiếu trong truy vấn bên ngoài.

Điều này cũng đúng đối với các truy vấn khác của bạn:

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

Hãy thử những điều này và xem nếu họ làm việc.

0

Thay vì không tồn tại, hãy thử

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

Tại sao điều này hoạt động tốt hơn KHÔNG tồn tại? –

+0

Cảm ơn điều đó đã giúp ích rất nhiều !! KHÔNG THỂ được sử dụng trong một tình huống mà tôi muốn kiểm tra ngày là tốt? Vì vậy, chỉ chèn nếu Mã sản phẩm và ngày không tồn tại với ngày hiện tại trong cùng một bản ghi? – user2158168

+0

Không, KHÔNG IN so sánh giá trị của một mục với kết quả của câu lệnh SELECT trong đó một cột được trả về. Nếu bạn cần kiểm tra sự tồn tại của nhiều giá trị, bạn nên quay trở lại NOT EXISTS – Melanie

0

thử này ...

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

Bạn không cần cả hai tồn tại và bên tham gia trong trường hợp product_code của bạn xác định các bản ghi trong cả hai những cái bàn.

Vì vậy, tôi cho rằng bạn đang sử dụng bảng temp như một tài liệu tham khảo và thêm bản ghi vào bảng từ bảng temp chỉ trong trường hợp nó chỉ tồn tại trong bảng temp

Vì vậy, câu hỏi của bạn nên có cái gì đó như

insert into no_stock 
select * from #no_stock 
where product_code not in (select product_code from no_stock) 
Các vấn đề liên quan