sql - 如何仅在不存在时插入

标签 sql sql-server sql-server-2005 insert

我想在表中插入数据,但如果它已经存在于表中,那么它不应该添加。
这是我想出的代码,但它仍然添加具有相同值的多个数据。

insert into nol_art_izm([ART_ID],[DAT])
    select distinct
        v.id_art, {fn now()}
    from
        openxml(@hDoc, '/art_kompl/nol_voac') with #vc xd
        inner join nol_voac v on xd.id_art = v.id_art
    where
        not exists(select * from nol_art_izm where nol_art_izm.art_id=xd.id_art)


我希望没有任何重复的“ART_ID”值

最佳答案

注意:此答案仅适用于 SQL Server 2008...

使用 MERGE陈述。 MERGE 语句的优点是它清楚地表达了仅在没有匹配项时才想插入的意图。对于 future 的读者,这可能会有所帮助,因为涉及 INSERT .. SELECT 的替代方案更难破译。

-- This is where you're "merging" data into
MERGE INTO nol_art_izm dst

-- This is your merge data source
USING (
  -- Use DISTINCT here, to prevent possible duplicates from the below INNER JOIN
  SELECT DISTINCT v.id_art 
  FROM openxml(@hDoc, '/art_kompl/nol_voac') with #vc xd
  INNER JOIN nol_voac v on xd.id_art = v.id_art
) src

-- This is your "join" condition, used to decide whether to perform an
-- INSERT or UPDATE
ON (dst.art_id = src.id_art)

-- When source and target don't match (see ON clause), perform an insert
WHEN NOT MATCHED THEN INSERT ([ART_ID],[DAT])
  VALUES (src.id_art, {fn now()})

此语句省略了 WHEN MATCHED THEN UPDATE 子句,因为您只对执行 INSERTs 感兴趣,而不是 UPDATEs

关于sql - 如何仅在不存在时插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9871432/

相关文章:

tsql - 从同一/另一个表中的另一列向 XML 列添加属性

sql - 如何合并 2 个 SQL 查询?

SQL Server 2008 : Joining results of STORED PROCEDURE (dynamic columns) with results of a SELECT statement

sql - 有没有什么可视化工具可以实现SQL查询数据输出结果的层次化风格?

sql-server - DAO RecordsAffected 在通路合并后未返回正确的值

sql-server-2005 - SQL Server Management Studio 2008 智能感知

php - Laravel 4 Eloquent 查询

sql - 在 SQL 中将 9999999999 显示为 9-999-99999-9

插入时可以进行 SQL 排序吗?

sql - 将月份和年份字符串转换为日期的有效方法是什么?