求实现仅返回同时存在City A和C的用户记录的PL/SQL语句
筛选同时关联City A和C的用户记录解决方案
嘿,针对你这个需求——找出同时拥有City A和C记录的用户,并且返回这些用户的所有A/C相关记录(排除只关联A或只关联C的用户),我整理了几种实用的PL/SQL实现方式,都能精准得到你想要的结果:
方法1:窗口函数(推荐,性能更优)
用窗口函数可以一次性计算每个用户关联的所有City,直接筛选出同时包含A和C的用户:
WITH user_city_summary AS ( SELECT User, City, -- 把当前用户的所有City去重后拼接成字符串 LISTAGG(DISTINCT City, ',') WITHIN GROUP (ORDER BY City) OVER (PARTITION BY User) AS user_associated_cities FROM your_table_name ) SELECT User, City FROM user_city_summary WHERE user_associated_cities = 'A,C' -- 确保用户同时关联A和C ORDER BY User, City;
方法2:子查询+分组统计
通过统计每个用户关联的目标City数量来筛选符合条件的用户:
SELECT t.User, t.City FROM your_table_name t INNER JOIN ( SELECT User FROM your_table_name WHERE City IN ('A', 'C') -- 只聚焦A和C的记录 GROUP BY User HAVING COUNT(DISTINCT City) = 2 -- 必须同时有A和C两条不同的记录 ) qualified_users ON t.User = qualified_users.User WHERE t.City IN ('A', 'C') -- 可选:如果用户还有其他City,只返回A/C相关记录 ORDER BY t.User, t.City;
方法3:双EXISTS关联查询
通过两次EXISTS检查,确保用户同时存在A和C的记录:
SELECT User, City FROM your_table_name t WHERE City IN ('A', 'C') AND EXISTS ( SELECT 1 FROM your_table_name t1 WHERE t1.User = t.User AND t1.City = 'A' ) AND EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.User = t.User AND t2.City = 'C' ) ORDER BY User, City;
测试验证
假设你的表名为user_city,先插入测试数据:
INSERT INTO user_city (User, City) VALUES (1, 'A'), (1, 'B'), (1, 'C'), (2, 'A'), (2, 'C'), (3, 'A'), (3, 'C'), (4, 'A'), (5, 'B');
执行任意上述语句后,都会得到你预期的结果:
| User | City |
|---|---|
| 1 | A |
| 1 | C |
| 2 | A |
| 2 | C |
| 3 | A |
| 3 | C |
小提示
- 记得把
your_table_name替换成你实际使用的表名哦 - 如果用户可能有重复的City记录(比如同一个用户多次关联A),一定要用
COUNT(DISTINCT City),不然会误判 - 窗口函数方法需要Oracle 11g及以上版本支持,要是用的是更低版本,方法2或3会更稳妥
内容的提问来源于stack exchange,提问作者ablockofcheeze
相关产品推荐
相关产品推荐

