【问题标题】:Inner join returning duplicate records access sql内连接返回重复记录访问sql
【发布时间】:2014-04-03 21:19:55
【问题描述】:

我有下表。数据的唯一区别是suff, wt;其余的看起来都一样。

事物表

  Prefix  Baseletter  suff   CSCcode   Description  WT      BNO      BNO-CSCcode 

  EIGC    A5560        BGA    04020    blah1        0       5560      5560-04020
  EIGC    A5560        HEA    04020    blah2        17.9    5560      5560-04020

映射表

  BNO      BNO-CSCcode    EID    Description   

  5560      5560-04020   4005    blah1
  5560      5560-04020   4011    blah2

我正在尝试使用 BNO-CSCcode 将它们内部连接起来,以获取相应 BNO 的 EID。但我的查询返回重复项。我得到了 4 条记录,即使第一个表只有两条记录。

我的 SQL 查询:

SELECT 
  Things.Prefix ,
  Things.Baseletter,
  Things.suff,
  Things.CSCcode,
  Things.WT,
  Mapping.BNO-CSCcode,
  Mapping.EID 
FROM 
  Things 
  INNER JOIN Mapping ON Things.BNO-CSCcode = Mapping.BNO-CSCcode 

为什么会出现这些重复,我该如何解决?

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    BNO-CSCcode 包含重复项。您将Things 的第一条记录加入Mapp 的两条记录,然后Things 的第二条记录加入Mapp 的两条记录。总共给你 4 条记录。

    如果您想将它们连接在一起,您需要一些独特的方式来识别表之间的行。

    Distinct 应该将其恢复为 2 条记录,但您可能需要加入更多字段才能将其恢复为 2 条记录:

    SELECT DISTINCT
      Things.Prefix,
      Things.Baseletter,
      Things.suff,
      Things.CSCcode,
      Things.WT,
      Mapping.BNO-CSCcode,
      Mapping.EID 
    FROM 
      Things 
      INNER JOIN Mapping ON Things.BNO-CSCcode = Mapping.BNO-CSCcode 
    

    【讨论】:

    • 使用 DISTINCT 时结果没有改变
    • @vuyy1182 行之间有什么不同?
    • Suff
    • @vuyy1182 那么我认为您的数据可能与您的示例不同。为什么suff 在不同的表中会有所不同?
    • @vuyy1182 按BNO-CSCcode AND suff 排序查询,找到您的重复项,看看其他列有什么不同。
    【解决方案2】:

    因为Things 表中的两条记录都具有5560-04020 的BNO-CSCcode,您得到重复,Mapp 表中的两条记录也是如此。我能看到的两者之间的唯一区别是Description 字段。因此,如果您使用以下查询:

    SELECT Things.Prefix ,Things.Baseletter,Things.suff,Things.CSCcode,Things.WT,Mapping.BNO-CSCcode,Mapping.EID
    FROM Things INNER JOIN Mapping ON Things.BNO-CSCcode = Mapping.BNO-CSCcode AND 
    Things.Description = Mapping.Description
    

    ...你应该消除重复。

    但是,在连接中使用显然是文本字段的字段并不是最佳实践,因为它们是单独由用户生成的,它们不太可能匹配,并且需要更长的时间(相对而言)来匹配具有字节数比低字节数高。

    【讨论】:

    • Not Description 字段不同。 Suff 是不同的。但映射表中不存在。
    • “非描述字段不同”是什么意思?你的意思是说Mapp 中的记录不一定与Things 中的Descriptions 相同?
    【解决方案3】:
        select
           A.Code,
           B.Code as CustomerBeneficiaryCode,
           C.AccountNo as  CustomerBeneficiaryBankAccountNo
           ,COUNT(*) as Duplicate
    
    from Table A
    inner join  Table B on A.id = B.CustomerIndividualId
    inner join  Table C on B.Id = C.CustomerBeneficiaryId
    
    group by C.AccountNo,B.Code,A.Code having COUNT(*) > 1
    

    【讨论】:

      【解决方案4】:

      试试这个

      SELECT DISTINCT Prefix,
                  Baseletter,
                  suff,
                  CSCcode,
                  WT,
                  BNO_CSCcode,
                  EID
      FROM (
             SELECT Things.Prefix AS Prefix,
                    Things.Baseletter AS Baseletter,
                    Things.suff AS suff,
                    Things.CSCcode AS CSCcode,
                    Things.WT AS WT,
                    Mapping.BNO - CSCcode AS BNO_CSCcode,
                    Mapping.EID AS EID
               FROM Things
                    INNER JOIN
                    Mapping ON Things.BNO - CSCcode = Mapping.BNO - CSCcode
         );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-23
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 2017-01-16
        • 1970-01-01
        相关资源
        最近更新 更多