You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中使用多NOT IN子句:新增城市时的重复校验问题

解决方案:使用NOT IN插入不存在的城市记录

首先,我能明白你的需求:要从表变量@table里把City表中还没存在的城市插入到现有City表中,同时还要处理@table里可能重复的城市条目(比如多条Chennai的记录)。下面是具体的实现步骤和SQL代码:

核心思路

  1. 先对@table里的城市数据去重——毕竟同一个城市可能对应多个邮编,但只需要往City表里插一次
  2. 用NOT IN子句过滤掉City表中已有的城市
  3. 借助数据库的自增主键特性(假设ID_City是自增列,比如SQL Server的IDENTITY),插入时不用手动指定ID值

具体SQL代码

-- 假设@table已经完成定义和数据填充
-- 执行插入操作
INSERT INTO City (City, ID_State)
SELECT DISTINCT t.City, t.ID_State
FROM @table t
WHERE t.City NOT IN (SELECT City FROM City);

代码细节解释

  • SELECT DISTINCT t.City, t.ID_State:对@table里的城市和对应州ID做去重处理,避免重复插入同一个城市
  • WHERE t.City NOT IN (SELECT City FROM City):检查待插入的城市是否已存在于City表中,只有不存在的城市才会被选中插入
  • 因为ID_City是主键且为自增列,所以INSERT语句里不需要包含这个字段,数据库会自动为新记录生成唯一ID

优化补充:处理NULL值场景

如果City表的City字段允许存储NULL值,NOT IN可能会出现判断异常(NULL的比较结果为未知),这时候改用NOT EXISTS会更稳妥:

INSERT INTO City (City, ID_State)
SELECT DISTINCT t.City, t.ID_State
FROM @table t
WHERE NOT EXISTS (
    SELECT 1 FROM City c 
    WHERE c.City = t.City
);

NOT EXISTS在处理NULL值时逻辑更稳定,推荐在这类存在潜在NULL值的场景下使用。

内容的提问来源于stack exchange,提问作者schikkamksu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:30:18