如何编写SQL查询找出关联某记录但不关联另一记录的数据
解决方法:筛选仅与Nike合作且排除Reebok合作的公司ID
下面给你几种实用的写法,都能实现需求:
方法1:NOT EXISTS 子查询
直接在原查询基础上,添加条件排除那些存在Reebok合作记录的公司:
SELECT c.id FROM company c INNER JOIN company_partner cp ON c.id = cp.company_id WHERE cp.company_name = 'Nike' AND NOT EXISTS ( SELECT 1 FROM company_partner cp2 WHERE cp2.company_id = c.id AND cp2.company_name = 'Reebok' )
逻辑:先找到所有和Nike合作的公司,再剔除掉同时和Reebok有合作记录的公司。
方法2:LEFT JOIN + IS NULL
通过左连接筛选出没有Reebok合作记录的公司,同时确保有Nike合作:
SELECT c.id FROM company c INNER JOIN company_partner cp_nike ON c.id = cp_nike.company_id AND cp_nike.company_name = 'Nike' LEFT JOIN company_partner cp_reebok ON c.id = cp_reebok.company_id AND cp_reebok.company_name = 'Reebok' WHERE cp_reebok.id IS NULL
逻辑:先关联Nike的合作记录保证公司和Nike合作,再左连Reebok的记录,只保留左连后没有匹配到Reebok数据的公司(也就是没和Reebok合作的)。
方法3:GROUP BY + HAVING 统计品牌
如果需要更灵活的筛选(比如扩展到多个品牌),可以用分组统计的方式:
SELECT c.id FROM company c INNER JOIN company_partner cp ON c.id = cp.company_id GROUP BY c.id HAVING SUM(CASE WHEN cp.company_name = 'Nike' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN cp.company_name = 'Reebok' THEN 1 ELSE 0 END) = 0
逻辑:按公司分组,统计每个公司和Nike合作的次数(至少1次),同时统计和Reebok合作的次数为0次,这样就满足仅和Nike合作的要求。
内容的提问来源于stack exchange,提问作者Vinyl Warmth
相关产品推荐
相关产品推荐

