如何编写SQL查询未关联Primary产品类型的账户?
查询未拥有Primary产品类型的账户
数据库结构
| Account | Product Type |
|---|---|
| 1 | Primary |
| 1 | Addon |
| 2 | Addon |
| 3 | Addon |
| 4 | Primary |
| 4 | Addon |
解决方案
这里提供几种可行的SQL写法,都能返回预期的账户2和3:
方法1:使用NOT IN
SELECT DISTINCT Account FROM your_table_name WHERE Account NOT IN ( SELECT Account FROM your_table_name WHERE `Product Type` = 'Primary' );
先通过子查询筛选出所有拥有Primary产品的账户,再在外层查询中排除这些账户,DISTINCT用于避免同一账户因多条Addon记录重复出现。
方法2:使用NOT EXISTS
SELECT DISTINCT t1.Account FROM your_table_name t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.Account = t1.Account AND t2.`Product Type` = 'Primary' );
这种方式效率通常更高(尤其是表有合适索引时),它会逐个校验每个账户是否存在对应的Primary产品记录,不存在则保留该账户。
方法3:使用GROUP BY + HAVING
SELECT Account FROM your_table_name GROUP BY Account HAVING SUM(CASE WHEN `Product Type` = 'Primary' THEN 1 ELSE 0 END) = 0;
按账户分组后,统计每个账户下Primary产品的数量,数量为0的即为未拥有该类型产品的账户,无需子查询,逻辑直观。
注意:如果使用SQL Server等数据库,字段名中的空格需用方括号
[Product Type]替代反引号。
内容的提问来源于stack exchange,提问作者Govind Shah
相关产品推荐
相关产品推荐

