"不在"在sql中无法正常工作

时间:2014-03-23 10:48:50

标签: sql sql-server distinct

我的存储过程中有一个代码:

create procedure [dbo].[add_codes](@codes code_type readonly, @id int)as
    insert into codes(code,value) 
           select code,'' value from @codes
           where code not in (select code from codes)

这应该只插入新值,忽略重复但是没有重复,当我检查代码不同代码的数量时,在一些插入后,它们具有不同的值。我的代码出了什么问题?

2 个答案:

答案 0 :(得分:4)

NOT IN 应该工作,但对于像这样简单的事情,您可以执行以下操作:

INSERT INTO codes (code, value) 

SELECT DISTINCT
            code,
            '' AS value

FROM        @codes AS n

LEFT JOIN   codes AS c
    ON      n.code = c.code

WHERE       c.code IS NULL

当然,在表上设置UNIQUE约束也是值得的。

答案 1 :(得分:0)

NOT IN 工作。如果NULL中只有一个codes值,则NOT IN的行为有点违反直觉。 工作,但它总是返回" false"。这是因为NULL不是特定值,而是未知值。

如果您使用not in

,则应该保护您的代码不受此影响
create procedure [dbo].[add_codes](@codes code_type readonly, @id int)
as begin
    insert into codes(code,value) 
           select code,'' value from @codes
           where code not in (select code from codes where code is false);
end;

我非常同意Rowland的观点,正确的方法是使用unique约束你想要独特的列。