SQL Server JOIN查询异常:预期1行却返回2行求助
SQL Server关联查询返回多行问题分析与解决办法
原因分析
- 关联的
peg_dtl_anak表中,对应目标id_pegawai存在多条匹配数据,和form_pertambahan_anak表中唯一符合条件的1条数据关联后,产生多行结果。 - 关联条件不完整:仅用
id_pegawai作为关联字段,两张表之间可能存在更精准的唯一关联字段(如id_anak)未加入,导致一对多的匹配。 status = '1'的过滤条件仅作用于form_pertambahan_anak表,未对peg_dtl_anak表的对应数据做限制,若该表同id_pegawai下有多条数据,都会被关联输出。
解决办法
1. 补全精准关联条件
确认两张表的业务关联逻辑,加入唯一匹配字段(比如id_anak),确保关联是一对一匹配:
SELECT * FROM form_pertambahan_anak fpa INNER JOIN peg_dtl_anak pda ON fpa.id_pegawai = pda.id_pegawai AND fpa.id_anak = pda.id_anak -- 假设该字段为两表的唯一关联标识 WHERE fpa.id_pegawai = '你的指定ID' AND fpa.status = '1'
2. 使用DISTINCT去重(仅需主表数据时)
如果只需要form_pertambahan_anak表的符合条件数据,用DISTINCT过滤掉关联带来的重复行:
SELECT DISTINCT fpa.* -- 仅选择主表字段,避免因关联表字段差异导致去重失效 FROM form_pertambahan_anak fpa INNER JOIN peg_dtl_anak pda ON fpa.id_pegawai = pda.id_pegawai WHERE fpa.id_pegawai = '你的指定ID' AND fpa.status = '1'
3. 用EXISTS替代JOIN(仅需判断关联存在时)
如果不需要peg_dtl_anak表的字段,只是要确认该员工有对应的子表数据,用EXISTS可以保证主表数据仅返回一次:
SELECT * FROM form_pertambahan_anak fpa WHERE fpa.id_pegawai = '你的指定ID' AND fpa.status = '1' AND EXISTS ( SELECT 1 FROM peg_dtl_anak pda WHERE pda.id_pegawai = fpa.id_pegawai -- 可根据业务需求添加其他关联条件 )
4. 同时过滤关联表的状态(若业务需要)
如果peg_dtl_anak表也有status字段,且仅需关联该表中状态为有效(status='1')的数据,需在条件中加入该过滤:
SELECT * FROM form_pertambahan_anak fpa INNER JOIN peg_dtl_anak pda ON fpa.id_pegawai = pda.id_pegawai WHERE fpa.id_pegawai = '你的指定ID' AND fpa.status = '1' AND pda.status = '1'
内容的提问来源于stack exchange,提问作者Fathul Muiin
相关产品推荐
相关产品推荐

