2013-03-11 5 views
6

То, что я пытаюсь сделать, это сравнить таблицу с другой временной таблицей, а если запись еще не существует, вставьте ее в таблицу. Моя проблема заключается в том, что IF NOT EXIST не кажется правильным. Если я тянуть код врозь У меня есть проблема:SQL Вставить запись, если ее нет

Возвращает 29 результатов:

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. 

Это не возвращает никаких результатов (я бы ожидать, что это вернется 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) 

Это возвращает 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) 

пс. с помощью SQL Server 2008 R2

ответ

6

Ломайте свои внутренние соединения в своих подзапросах.

То, что вы должны пытаться это следующее:

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

Вам не нужно внутреннее соединение здесь, потому что таблица #no_stock упоминается во внешнем запросе.

То же самое верно для других запросов:

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

Попробуйте это и посмотреть, если они работают.

0

Вместо NOT EXISTS, попробуйте

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

Почему это работает лучше, чем НЕ СУЩЕСТВУЕТ? –

+0

Спасибо, что помогло много! Может ли НЕ использоваться в ситуации, когда я хочу проверить дату? Так что только вставьте, если Код продукта и дата не существуют с текущей датой в той же записи? – user2158168

+0

Нет, NOT IN сравнивает значение одного элемента с результатом оператора SELECT, в котором возвращается один столбец. Если вам нужно проверить наличие нескольких значений, вам лучше вернуться к NOT EXISTS – Melanie

0

попробовать это ...

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

Вам не нужно как существует и внутреннее соединение в случае, если ваш product_code определяет записи в обоих столы.

Так что я полагаю, вы используете временную таблицу в качестве ссылки и добавление записи в таблицу из временной таблицы только в случае, если она существует только в временной таблице

Таким образом, ваш запрос должен быть чем-то вроде

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

 Смежные вопросы

  • Нет связанных вопросов^_^