如何解决子查询返回多值问题,通过子查询获取用户最新密码创建时间
问题原因
你原有SQL报错的核心原因是IN运算符要求子查询返回的列数和左侧匹配列的数量完全一致,你左侧只提供了user.id单列,子查询却返回了user_id、max(created_at)两列,无法完成匹配。
仅子查询实现方案(无需JOIN)
方案1:标量子查询(兼容所有主流数据库,支持返回无密码记录的用户)
直接在查询字段中嵌入关联子查询获取对应用户的最新密码创建时间,无密码记录的用户对应时间会返回NULL:
SELECT u.id AS user_id, (SELECT MAX(created_at) FROM PASSWORD p WHERE p.user_id = u.id) AS latest_password_created_at FROM USER_DETAILS u;
如果只需要返回有密码记录的用户,新增EXISTS子查询过滤即可:
SELECT u.id AS user_id, (SELECT MAX(created_at) FROM PASSWORD p WHERE p.user_id = u.id) AS latest_password_created_at FROM USER_DETAILS u WHERE EXISTS (SELECT 1 FROM PASSWORD p WHERE p.user_id = u.id);
方案2:派生表子查询
如果你的使用场景允许用派生表(不属于JOIN语法范畴),可以先通过子查询聚合出所有用户的最新密码时间,再和用户表匹配:
SELECT u.id AS user_id, p_max.latest_password_created_at FROM USER_DETAILS u, (SELECT user_id, MAX(created_at) AS latest_password_created_at FROM PASSWORD GROUP BY user_id) p_max WHERE u.id = p_max.user_id;
内容的提问来源于stack exchange,提问作者Newton8989
相关产品推荐
相关产品推荐

