长格式表按组条件筛选行及MS SQL查询无hello列的表
找出不含
hello列的目标表(MS SQL Server) 嘿,我来帮你搞定这个需求!你已经有了一个能返回长格式表(每个表对应多行,每行是一个列)的查询,现在要从中筛选出完全没有hello列的表,这里给你两种实用的方法:
方法1:直接用NOT EXISTS(性能更优)
这种方式不用先生成全量的长格式数据,直接从系统表做存在性检查,效率更高:
SELECT t.name AS 'TableName' FROM sys.tables t WHERE t.name IN (SELECT colname FROM someTable) AND NOT EXISTS ( -- 检查当前表是否存在名为hello的列 SELECT 1 FROM sys.columns c WHERE c.object_id = t.object_id AND c.name = 'hello' )
逻辑很简单:先锁定someTable里的所有目标表,再排除掉那些包含hello列的表,剩下的就是你要的结果。
方法2:基于长格式结果分组筛选
如果一定要基于你原来的长格式查询结果来处理,可以用CTE+分组统计的方式:
-- 先生成长格式的表-列对应数据 WITH TableColumns AS ( SELECT c.name AS 'ColumnName', t.name AS 'TableName' FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE t.name IN (SELECT colname FROM someTable) ) -- 分组后统计每个表是否有hello列 SELECT TableName FROM TableColumns GROUP BY TableName HAVING SUM(CASE WHEN ColumnName = 'hello' THEN 1 ELSE 0 END) = 0
这里的思路是:先把所有表的列数据存到临时结果集里,然后按表名分组,统计每个表中hello列出现的次数——次数为0的,就是完全不含该列的表。
两种方法都能满足你的需求,优先推荐第一种,因为它避免了不必要的数据扫描,在表数量多的时候性能差异会很明显。
内容的提问来源于stack exchange,提问作者xhr489
相关产品推荐
相关产品推荐

