2011-06-08 76 views
5

我有如下所示的T-SQL。 @Results是一个表变量,'CTE'是一个公共表表达式。如果我要插入的SubId尚未被插入到表中,我只想将行插入到@Results表中。下面显示的代码不能完成这项工作,我不知道为什么。任何人都可以看到问题吗?T-SQL - 只在表中插入一行,如果它不存在

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) 
+1

是什么问题?错误信息? – user492238 2011-06-08 14:56:24

+0

你可能不得不张贴cte - 或者甚至更好:把它煮成更小的演示。可能你的问题甚至通过这样做来解决问题......;) – user492238 2011-06-08 14:57:21

+0

添加重复项时是否收到错误消息? – Sung 2011-06-08 15:28:48

回答

6

首先,您需要检查所有脑干:

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再次过滤输出...

+1

使用连接不是更好吗? – Hogan 2011-06-08 16:15:13

+0

@霍根:不 - 为什么?你认为使用JOIN可以获得什么? – 2011-06-08 18:06:22

+0

,因为必须对每行(新选择)执行此检查,其中在SQL中优化连接以在日期集合上快速工作。它是O(n)优化与O(1)+ O(1)+ ... + O(1)n次之间的差异。 (请参阅我的回答以获取使用连接的示例。) – Hogan 2011-06-08 21:51:54

0

检查记录存在或不使用“存在”

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) 
2

我会做这样的(假设 - 你不必重复子ID在你的CTE,这是你在这个相同的查询插入子ID 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

尝试的`except子句:

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 
相关问题