如何查询仅关联TagId=1且未关联TagId=2的Tags表记录
问题:筛选仅关联TagId=1且未关联TagId=2的记录
现有Tags表结构及数据
| TagId | Name |
|---|---|
| 1 | abc |
| 2 | abc |
| 1 | def |
| 2 | def |
| 1 | ret |
需求说明
需要获取仅关联TagId = 1,且未关联TagId = 2的唯一记录。即如果某个Name同时绑定了TagId=1和TagId=2,则不返回该Name的任何记录,最终只保留仅与TagId=1关联的Name记录。
预期结果
| TagId | Name |
|---|---|
| 1 | ret |
你尝试的SQL语句
SELECT * FROM (SELECT ROW_NUMBER() OVER (PARTITION BY TagId ORDER BY Name) RN FROM Tags) t WHERE t.tagId = 1
正确的查询方法
下面提供几种可行的解法:
方法一:分组统计筛选
通过分组统计每个Name关联的不同TagId数量,筛选出仅包含TagId=1的记录:
SELECT TagId, Name FROM Tags WHERE Name IN ( SELECT Name FROM Tags GROUP BY Name HAVING COUNT(DISTINCT TagId) = 1 AND MAX(TagId) = 1 )
方法二:左连接排除法
通过左连接匹配存在TagId=2的同名记录,筛选出没有匹配结果(即未关联TagId=2)且当前TagId=1的记录:
SELECT t1.TagId, t1.Name FROM Tags t1 LEFT JOIN Tags t2 ON t1.Name = t2.Name AND t2.TagId = 2 WHERE t2.Name IS NULL AND t1.TagId = 1
方法三:NOT EXISTS子查询
直接排除那些存在TagId=2关联的Name,只保留TagId=1且无对应TagId=2记录的数据:
SELECT TagId, Name FROM Tags t1 WHERE TagId = 1 AND NOT EXISTS ( SELECT 1 FROM Tags t2 WHERE t2.Name = t1.Name AND t2.TagId = 2 )
内容的提问来源于stack exchange,提问作者HungryForKnowledge
相关产品推荐
相关产品推荐

