2014-04-03 63 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'中的描述相同嗎? –