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

SQL Server 2014:查询不在多个同前缀表中的ID值

解决SQL Server 2014中批量匹配前缀表的ID筛选问题

SQL Server 2014不支持直接用通配符(如MyTable%)作为表名编写静态查询,你需要通过动态SQL实现需求,以下两种方案可供参考:

方案一:动态拼接NOT EXISTS条件

先从系统视图中获取所有名称以MyTable开头的表,自动拼接出对应的NOT EXISTS筛选条件:

DECLARE @sql NVARCHAR(MAX) = N'';

-- 用FOR XML PATH拼接字符串(适配SQL Server 2014)
SELECT @sql = @sql + N'AND NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(name) + N' m WHERE m.ID = w.ID) '
FROM sys.tables
WHERE name LIKE 'MyTable%';

-- 组装完整查询语句
SET @sql = N'SELECT ID FROM want w WHERE 1=1 ' + @sql;

-- 执行生成的动态SQL
EXEC sp_executesql @sql;

方案二:动态合并目标表ID后筛选

先通过UNION ALL合并所有MyTable开头表的ID,再用NOT EXISTS筛选不在这些ID中的数据:

DECLARE @sql NVARCHAR(MAX) = N'';

-- 拼接所有目标表的ID查询语句
SELECT @sql = @sql + N'SELECT ID FROM ' + QUOTENAME(name) + N' UNION ALL '
FROM sys.tables
WHERE name LIKE 'MyTable%';

-- 去除末尾多余的UNION ALL
SET @sql = LEFT(@sql, LEN(@sql) - 10);

-- 组装完整筛选语句
SET @sql = N'SELECT ID FROM want w WHERE NOT EXISTS (SELECT 1 FROM (' + @sql + N') t WHERE t.ID = w.ID)';

-- 执行动态SQL
EXEC sp_executesql @sql;

注意事项

  • 确认所有MyTable开头的表都包含ID列,否则动态SQL执行会报错
  • 使用QUOTENAME函数处理表名,避免表名含特殊字符导致语法错误
  • 若使用NOT IN替代NOT EXISTS,需确保所有目标表的ID列无NULL值,否则会导致筛选结果异常

内容的提问来源于stack exchange,提问作者John T.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:30:29