内连接返回重复记录访问sql

时间:2014-04-03 21:19:55

标签: sql ms-access

我有下表。数据的唯一区别是 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

Mapp表

  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 

为什么我会收到这些副本,我该如何解决?

4 个答案:

答案 0 :(得分:18)

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

如果要将这些连接在一起,则需要一些独特的方法来识别表之间的行。

A Distinct应该将其恢复为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 

答案 1 :(得分:2)

您正在获得重复项,因为Things表中的两个记录的BNO-CSCcode均为5560-04020,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

......你应该消除重复。

但是,在连接中使用显然是文本字段的字段不是最佳做法,就好像它们是单独的用户生成的,它们不太可能匹配,并且需要更长时间(相对而言)来匹配字段字节数高于字节数低的字节数。

答案 2 :(得分:0)

试试这个

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
   );

答案 3 :(得分:0)

    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