2014-04-03 64 views
7

我有下表。数据中唯一的区别是suff,wt;其他人看起来都一样。内部连接返回重复记录访问sql

事情表

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获得EID对应BNO加入他们的行列。但我的查询返回重复。即使第一个表只有两条记录,我也会得到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 

为什么会出现这些重复,我怎么能解决呢?

回答

13

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

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

的鲜明应该使其回落到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 
+0

使用DISTINCT时结果没有改变 – vuyy1182

+0

@ vuyy1182行之间的列有什么不同? – paqogomez

+0

这是** Suff **列 – vuyy1182

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 

...您应该消除重复。

但是,在连接中使用显然是文本字段的字段并不是最佳实践,就好像它们分别是用户生成的,它们不太可能匹配,并且需要更长的时间(相对来说)将字段与比具有低字节数的字节数更高的字节数。

+0

不是**描述**字段是不同的。 ** Suff **不同。但是这在映射表中不存在。 – vuyy1182

+0

你是什么意思“不说明字段是不同的”?你的意思是说'Mapp'中的记录不一定与'Things'中的描述相同吗? –