You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL如何查询Foo表中同时存在App1和App2记录的对应CUSTOMER表客户

方案1:使用GROUP BY + HAVING 聚合过滤(通用性更强)

该方案适合后续需要扩展匹配更多应用的场景,也兼容同客户存在同应用重复关联的脏数据场景:

SELECT C.* 
FROM CUSTOMER C 
INNER JOIN FOO F ON F.CUSTOMER_ID = C.ID
INNER JOIN APP A ON A.ID = F.APP_ID
WHERE A.NAME IN ('App 1', 'App 2') -- 先过滤出两个目标应用的关联记录
GROUP BY C.ID -- 部分数据库要求GROUP BY包含所有SELECT的非聚合字段,可按需补充C表其他字段
HAVING COUNT(DISTINCT A.NAME) = 2; -- 确保客户同时匹配到两个不同的应用

说明:DISTINCT用来避免同一个客户在Foo表中存在多条同应用关联记录时,统计计数虚高导致误判。如果业务逻辑已经保证Foo表中同一个客户+同一个应用只会有一条记录,可以去掉DISTINCT提升查询性能。

方案2:多次关联匹配(固定2个应用时性能更优)

如果明确只需要匹配两个固定应用,可以通过两次关联分别匹配两个应用,只有两个关联都命中的客户才会被返回:

SELECT C.*
FROM CUSTOMER C
-- 关联匹配App 1的记录
INNER JOIN FOO F1 ON F1.CUSTOMER_ID = C.ID
INNER JOIN APP A1 ON A1.ID = F1.APP_ID AND A1.NAME = 'App 1'
-- 关联匹配App 2的记录
INNER JOIN FOO F2 ON F2.CUSTOMER_ID = C.ID
INNER JOIN APP A2 ON A2.ID = F2.APP_ID AND A2.NAME = 'App 2';

说明:该方案不需要分组聚合,数据量较大且关联字段有索引的情况下,查询效率会优于聚合方案。

注:你原SQL中存在引号混用错误,`'App 1`` 右侧的反引号需要替换为单引号和左侧配对,否则会触发语法报错。

内容的提问来源于stack exchange,提问作者Guest User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:45:02