如何编写SQL脚本判断公司是否关联特定合作伙伴记录?
解决方案
先明确你的表结构:
-- company表 id 1 2 3 -- company_partner表 id company_id company_name 1 1 Nike 2 1 Reebok 3 2 Nike 4 3 Nike
要实现每个公司是否存在Nike、Reebok合作伙伴的查询,你需要关联company表(确保所有公司都被展示,哪怕没有任何合作伙伴),再通过聚合逻辑生成状态列。你的尝试存在几个问题:未关联company表、错误用HAVING过滤而非生成状态、SELECT列重复。
通用SQL脚本(适配多数数据库)
SELECT c.id AS company, CASE WHEN COUNT(CASE WHEN cp.company_name = 'Nike' THEN 1 END) > 0 THEN 'true' ELSE 'false' END AS has_nike_partner, CASE WHEN COUNT(CASE WHEN cp.company_name = 'Reebok' THEN 1 END) > 0 THEN 'true' ELSE 'false' END AS has_rebook_partner FROM company c LEFT JOIN company_partner cp ON c.id = cp.company_id GROUP BY c.id ORDER BY c.id;
逻辑说明
- 用
LEFT JOIN关联两张表,保证所有公司都会出现在结果中,哪怕没有任何合作伙伴 - 内层
CASE WHEN筛选出对应合作伙伴的记录,外层通过COUNT统计数量:大于0则表示存在,返回true,否则返回false - 按
company.id分组,确保每个公司对应一行结果
优化写法(支持布尔类型的数据库,如PostgreSQL)
如果你的数据库原生支持布尔类型,用EXISTS子查询效率更高:
SELECT c.id AS company, EXISTS(SELECT 1 FROM company_partner cp WHERE cp.company_id = c.id AND cp.company_name = 'Nike') AS has_nike_partner, EXISTS(SELECT 1 FROM company_partner cp WHERE cp.company_id = c.id AND cp.company_name = 'Reebok') AS has_rebook_partner FROM company c ORDER BY c.id;
这个写法直接判断是否存在匹配记录,返回原生布尔值,数据量大时性能更优。
内容的提问来源于stack exchange,提问作者Vinyl Warmth
相关产品推荐
相关产品推荐

