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

Crystal Report+MySQL+C#左连接查询异常:数据重复且条件失效

解决Crystal Report中Left Join过滤条件失效及数据重复问题

一、先排查表链接配置是否正确

Crystal Report的表链接逻辑和原生SQL略有差异,错误的链接类型或字段直接会导致数据异常:

  1. 打开Crystal Report,点击顶部菜单的Database -> Database Expert
  2. 检查三个表的链接关系:
    • barang 与 pembelian:确保是Left Outer Join(左外连接),链接字段为barang.no_barang ↔ pembelian.no_barang(箭头方向从barang指向pembelian,代表以barang为主表,保留所有barang记录,即使没有对应采购数据)
    • pembelian 与 pelanggan:建议设置为Inner Join(内连接),链接字段为pembelian.no_pelanggan ↔ pelanggan.no_pelanggan(如果存在无客户的采购记录,可改为Left Outer Join)
    • 绝对禁止直接将barang与pelanggan建立链接,这会触发笛卡尔积,直接导致数据重复

二、修正过滤条件的放置位置

在Crystal Report中,若误将关联表的过滤条件放在Select Expert的WHERE区域,会强制把Left Join转为Inner Join,导致过滤失效或数据异常。针对你的场景分两种情况处理:

  1. 如果你要过滤barang表的no_barang = 2:
    • 点击顶部菜单Report -> Select Expert -> 选择barang.no_barang
    • 设置条件为is equal to,输入2后确定即可,这个逻辑和你在PhpMyAdmin里的SQL效果完全一致,不会破坏Left Join
  2. 如果你要过滤pembelian表的no_barang = 2(只显示有对应采购记录的barang=2数据):
    • 不要用Select Expert,而是修改链接的ON子句:
      • 在Database Expert中,双击barang和pembelian之间的链接线
      • 在弹出的编辑窗口里,把原链接条件barang.no_barang = pembelian.no_barang修改为barang.no_barang = pembelian.no_barang AND pembelian.no_barang = 2
      • 这样既保留了Left Join的逻辑,又能精准过滤关联表的条件

三、解决数据重复问题

如果链接配置正确但仍有重复数据,大多是因为一对多的关联关系(比如一个barang对应多条pembelian记录),可以用以下方式处理:

  1. 分组显示:点击顶部菜单Insert -> Group,选择barang.no_barang作为分组字段,把重复的明细数据合并到分组下,只展示唯一的商品信息
  2. 启用Distinct记录:点击顶部菜单Database -> Select Distinct Records,强制Crystal只返回唯一记录(注意:如果需要保留所有采购明细,不要用这个方法,分组更合适)
  3. 检查链接字段唯一性:确认每个表的链接字段都是主键(比如no_barang是barang的主键,no_order是pembelian的主键),避免非主键链接导致的重复匹配

四、验证效果

设置完成后点击预览按钮,应该只显示no_barang=2(baju)的记录,以及对应的采购单(no_order=1)和客户(Babay Azifahmi),不会出现其他商品记录,也不会有重复数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:40:46