SQL Server 2008:编写查询过滤ItemID含'A'并排除关联JournalID的行
解决方案:排除存在含'A' ItemID的JournalID所有行
嘿,我明白你的需求啦!你要的是彻底排除所有和ItemID含'A'的行同属一个JournalID的记录,对吧?之前用DISTINCT和GROUP BY没搞定很正常,因为咱们得从JournalID这个维度去过滤,而不是单单处理单个行。
下面给你两种适合SQL Server 2008的实现方法,都很容易理解:
方法1:使用NOT IN子查询
这种写法直观易懂,先找出所有存在问题的JournalID,再排除它们的所有行:
SELECT * FROM YourTableName -- 记得替换成你的实际表名 WHERE JournalID NOT IN ( -- 子查询:找出所有包含'A'的ItemID对应的JournalID SELECT DISTINCT JournalID FROM YourTableName WHERE ItemID LIKE '%A%' )
解释:
- 子查询里用
LIKE '%A%'匹配所有ItemID中包含'A'的行,再通过DISTINCT去重得到有问题的JournalID列表 - 主查询筛选出JournalID不在这个列表里的所有行,这样就彻底排除了所有关联到含'A' ItemID的记录
方法2:使用NOT EXISTS(推荐,大数据量下效率更高)
这种写法通过关联查询判断当前行的JournalID是否存在问题,逻辑更严谨:
SELECT t1.* FROM YourTableName t1 -- 主表别名t1 WHERE NOT EXISTS ( -- 子查询:检查当前JournalID下是否有ItemID含'A'的行 SELECT 1 FROM YourTableName t2 -- 子表别名t2 WHERE t2.JournalID = t1.JournalID AND t2.ItemID LIKE '%A%' )
解释:
- 对主表的每一行(t1),检查是否存在同一JournalID下(t2.JournalID = t1.JournalID)有ItemID含'A'的行
- 如果不存在这样的行,就保留当前的t1行
额外注意点
- 如果需要严格区分大小写(比如只排除含大写'A'的ItemID,小写'a'不算),可以把
LIKE '%A%'改成:ItemID LIKE '%A%' COLLATE SQL_Latin1_General_CP1_CS_AS - 记得把代码里的
YourTableName替换成你实际使用的表名哦!
内容的提问来源于stack exchange,提问作者Jonx1000
相关产品推荐
相关产品推荐

