2014-04-03 12 views
7

Mam poniższą tabelę. jedyna różnica w danych to suff, wt; reszta z nich wygląda tak samo.Wewnętrzne sprzężenie zwrotne zduplikowane rekordy dostępu sql

warte stół

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 stół

BNO  BNO-CSCcode EID Description 

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

Próbuję wewnętrzny połączyć je za pomocą BNO-CSCcode dostać EID za odpowiadające BNO. Ale moje zapytanie zwraca duplikaty. Dostaję 4 rekordy, mimo że pierwsza tabela ma tylko dwa rekordy.

Moje zapytanie 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 

Dlaczego otrzymuję tych duplikatów, i jak mogę to naprawić?

Odpowiedz

13

BNO-CSCcode zawiera duplikaty. Dołączasz do pierwszego rekordu Things do obu rekordów Mapp, następnie drugi rekord Things dołącza do obu rekordów Mapp. Daje ci w sumie 4 rekordy.

Jeśli chcesz połączyć te elementy, potrzebujesz unikalnego sposobu identyfikowania wierszy między tabelami.

odrębną powinien przynieść go z powrotem w dół do 2 zapisów:

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

Wynik nie zmienił się podczas korzystania z DISTINCT – vuyy1182

+0

@ vuyy1182 Jaka kolumna różni się między wierszami? – paqogomez

+0

To jest ** Suff ** kolumna – vuyy1182

2

Otrzymujesz duplikaty, ponieważ oba rekordy w tabeli Things mają BNO-CSCcode z 5560-04020, podobnie jak oba rekordy w tabeli Mapp. Jedyną różnicą między tymi dwoma, które widzę jest pole Description. Tak więc, jeśli używasz następującego zapytania:

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 

... powinieneś wyeliminować duplikację.

Jednak użycie pola, które jest oczywiście polem tekstowym w łączeniu, nie jest najlepszą praktyką, tak jakby było osobno generowane przez użytkowników, jest mało prawdopodobne, aby pasowało, i zajmuje więcej czasu (relatywnie rzecz biorąc), aby dopasować pola do większą liczbę bajtów niż te z niską liczbą bajtów.

+0

Nie ** Opis ** pole jest diffirent. ** Suff ** jest inny. Ale to nie istnieje w tabeli mapowania. – vuyy1182

+0

Co masz na myśli przez "Nie pole opisu jest inne"? Czy chcesz powiedzieć, że rekordy w 'Mapp' nie muszą mieć tego samego' Opisu 'jak w 'Rzeczy'? –

Powiązane problemy