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.
相关产品推荐
相关产品推荐

