欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 在pgsql中通过使用JOIN或EXISTS来解决主表与副表只在副表中使用条件查询,返回主表数据

在pgsql中通过使用JOIN或EXISTS来解决主表与副表只在副表中使用条件查询,返回主表数据

2024/12/31 1:27:29 来源:https://blog.csdn.net/weixin_44912902/article/details/144337496  浏览:    关键词:在pgsql中通过使用JOIN或EXISTS来解决主表与副表只在副表中使用条件查询,返回主表数据

比如,在pgsql中,我有两张表,一张是sanitation_maintenance_contract,另一张是sanitation_maintenance_contract_cycle,我需要在sanitation_maintenance_contract中写sql语句,但是在where中有个条件是根据sanitation_maintenance_contract_cycle中的start_date和end_date做条件。我只要sanitation_maintenance_contract_cycle中的条件判断而已 而不需要他的数据,sanitation_maintenance_contract的id和sanitation_maintenance_contract_cycle的contract_id是关联的。

主表sanitation_maintenance_contract

在这里插入图片描述

副表sanitation_maintenance_contract_cycle

在这里插入图片描述

解决方案

可以使用JOIN或EXISTS来解决,但是如何避免返回多条记录?

方案一:使用 DISTINCT(去重)

SELECT DISTINCT smc.*
FROM sanitation_maintenance_contract smc
JOIN sanitation_maintenance_contract_cycle smccON smc.id = smcc.contract_id
WHERE smcc.start_date <= '2024-12-01'AND smcc.end_date >= '2024-01-01';

在这里插入图片描述

  • DISTINCT 可以帮助去除重复的 sanitation_maintenance_contract
    记录。虽然它会增加查询的开销,但能有效地避免重复返回合同记录。

方案二:使用 EXISTS 来避免重复

只关心 sanitation_maintenance_contract 表的数据,并且想避免因为sanitation_maintenance_contract_cycle 表有多条记录而重复返回同一条合同记录,EXISTS可能是最合适的解决方案。

SELECT smc.*
FROM sanitation_maintenance_contract smc
WHERE EXISTS (SELECT 1FROM sanitation_maintenance_contract_cycle smccWHERE smcc.contract_id = smc.idAND smcc.start_date <= '2024-12-01'AND smcc.end_date >= '2024-01-01'LIMIT 1
);

在这里插入图片描述

  • 在这个查询中,EXISTS 子查询会检查是否存在符合条件的sanitation_maintenance_contract_cycle记录,但只要找到了符合条件的一条记录,它就会返回 sanitation_maintenance_contract 表的对应记录。
  • LIMIT 1 是多余的,因为 EXISTS 本身就是基于是否存在至少一条匹配记录来决定是否返回父查询的记录,但加上 LIMIT 1可以确保子查询只返回一条记录,提高效率。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com