T-SQL - вставить строку в таблицу, только если она еще не существует - PullRequest
5 голосов
/ 08 июня 2011

У меня есть T-SQL, показанный ниже. @Results является табличной переменной, а 'CTE' является распространенным табличным выражением. Я хочу вставить строки в таблицу @Results только в том случае, если SubId, который я собираюсь вставить, еще не был вставлен в таблицу. Код, показанный ниже, не выполняет работу, и я не уверен, почему. Кто-нибудь может увидеть проблему?

Insert Into @Results (
    Cell, 
    CellSettings, 
    RecipeInstanceId, 
    BiasStartTime, 
    SubId 
    RuleInstanceId)
Select 
    Cell, 
    CellSettings, 
    RecipeInstanceId, 
    BiasStartTime, 
    SubId, 
    RuleInstanceId
From CTE
Where CTE.SubId NOT IN (Select SubId From @Results)

Ответы [ 4 ]

6 голосов
/ 08 июня 2011

Сначала нужно проверить наличие:

IF NOT EXISTS(SELECT * FROM @Results WHERE SubId = .......)
   INSERT INTO @Results (Cell, CellSettings, RecipeInstanceId, 
                          BiasStartTime, SubId, RuleInstanceId)
     SELECT 
         Cell, CellSettings, RecipeInstanceId, 
         BiasStartTime, SubId, RuleInstanceId
     FROM CTE

Возможно, вы могли бы поместить это требование (только вернуть те строки, которые еще не существуют) в ваш CTE, чтобы вам не пришлось фильтроватьвыход из CTE еще раз ...

2 голосов
/ 08 июня 2011

Я бы сделал это так (предположим, у вас нет дублированного SubID в вашем CTE, то есть вы вставляете SubID в X, а затем в этот же запрос вставляете тот же самый).

WITH CTE AS
( 
  blah
), CTENEW AS
(
   SELECT CTE.* 
   FROM CTE
   LEFT JOIN @Results R ON CTE.SubID = R.SubID
   WHERE R.SubID IS NULL
)
Insert Into @Results (
    Cell, 
    CellSettings, 
    RecipeInstanceId, 
    BiasStartTime, 
    SubId 
    RuleInstanceId)
Select 
    Cell, 
    CellSettings, 
    RecipeInstanceId, 
    BiasStartTime, 
    SubId, 
    RuleInstanceId
From CTENEW

Или вы можете свернуть соединение, которое я сделал, в ваш CTE.

1 голос
/ 12 сентября 2013

Попробуйте `кроме предложения:

insert MyTable(c1, c2, c3)

select ot.c1, ot.c2, ot.c3
from OtherTable ot

except

select mt.c1, mt.c2, mt.c3
from MyTable
0 голосов
/ 08 июня 2011

Проверьте, существует ли запись или нет, используя "Exists"

If Not Exists(Select SubId From @Results)
    Insert Into @Results (
        Cell, 
        CellSettings, 
        RecipeInstanceId, 
        BiasStartTime, 
        SubId 
        RuleInstanceId)
    Select 
        Cell, 
        CellSettings, 
        RecipeInstanceId, 
        BiasStartTime, 
        SubId, 
        RuleInstanceId
    From CTE
    Where CTE.SubId NOT IN (Select SubId From @Results)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...