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

求实现仅返回同时存在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');

执行任意上述语句后,都会得到你预期的结果:

UserCity
1A
1C
2A
2C
3A
3C

小提示

  • 记得把your_table_name替换成你实际使用的表名哦
  • 如果用户可能有重复的City记录(比如同一个用户多次关联A),一定要用COUNT(DISTINCT City),不然会误判
  • 窗口函数方法需要Oracle 11g及以上版本支持,要是用的是更低版本,方法2或3会更稳妥

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:21:11