sql server - 检查插入中每一行的存在

Posted

技术标签:

【中文标题】sql server - 检查插入中每一行的存在【英文标题】:sql server - checking existence for each row in insert 【发布时间】:2019-12-18 11:38:16 【问题描述】:

如果字段“partita_iva”已在此表中,我需要插入并检查每一行,如果是,则字段“flag”必须为 1,否则必须为 0。我这样做了,但是为所有行设置 1,即使应该为 1 只为一行

INSERT INTO tab2(id, flag)
select newid, 
CASE 
    WHEN EXISTS(SELECT * FROM tab1 WHERE partita_iva IN(SELECT partita_iva FROM tab2))
    THEN 1
    ELSE 0
END AS flag
from tab1

【问题讨论】:

样本数据和期望的结果会有所帮助。你的代码很不清楚。 您要检查什么,是否存在名为 partita_iva 的列或 partita_iva 上的某些值是否存在?请清楚地提出问题。 @SagarTimalsina 我想检查 partita_iva 上的值是否存在,如果已经存在一个值,我必须将该值的标志设置为 1,使用我提供的代码,所有行都有 1即使它应该是 1 只是一行 【参考方案1】:

大概可以简化一下。

INSERT INTO tab2 (id, flag)
SELECT t1.newid
, IIF(EXISTS(SELECT 1 FROM tab2 t2 WHERE t2.partita_iva = t1.partita_iva), 1, 0) AS flag
FROM tab1 t1

【讨论】:

【参考方案2】:

您当前的查询逻辑对我来说似乎是正确的,但您可以关联您的子查询:

INSERT INTO tab2(id, flag)
      SELECT NEWID(), CASE WHEN EXISTS(SELECT 1 
                                       FROM tab2 t2 
                                       WHERE t2.partita_iva = t1.partita_iva 
                                      )
                           THEN 1 ELSE 0
                      END AS flag
      FROM tab1 t1;

NEWID() 是一个创建唯一标识符类型的唯一值的函数。

【讨论】:

【参考方案3】:

作为一个在黑暗中的总刺:

INSERT INTO tab2(Id,Flag)
SELECT newid, --Do you mean NEWID()?
       CASE WHEN EXISTS(SELECT 1 FROM tab2 T2 WHERE T2.partita_iva = T1.partita_iva) THEN 1 ELSE 0 END
FROM tab1 T1;

【讨论】:

以上是关于sql server - 检查插入中每一行的存在的主要内容,如果未能解决你的问题,请参考以下文章

如何在合并数据集之前检查行是不是存在(SQL Server)

在 SQL Server 中检查逗号分隔字符串中是不是存在子字符串的最有效方法

SQL Server中的标识列

SQL Server 怎么用存触发器实现从一个表里查询数据,然后插入到另一个表里

SQL Server的优点与缺点

在插入之前检查是不是存在时我的语法错误