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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:05:30