2014-04-03 22 views
7

Ich habe die folgende Tabelle. der einzige Unterschied in den Daten ist suff, wt; der Rest von ihnen sieht gleich aus.Inner Join Rückkehr doppelte Datensätze Zugriff sql

Things Tabelle

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 Tisch

BNO  BNO-CSCcode EID Description 

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

ich innere bin versucht, sich ihnen anzuschließen mit BNO-CSCcode EID erhalten für entsprechende BNO. Aber meine Abfrage gibt Duplikate zurück. Ich bekomme 4 Datensätze, obwohl die erste Tabelle nur zwei Datensätze enthält.

My SQL-Abfrage:

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 

Warum bin ich diese Duplikate bekommen, und wie kann ich das Problem lösen?

Antwort

13

BNO-CSCcode enthält Duplikate. Sie verbinden den ersten Datensatz von Things mit beiden Datensätzen von Mapp, dann wird der zweite Datensatz von Things mit beiden Datensätzen von Mapp verknüpft. Sie erhalten insgesamt 4 Datensätze.

Wenn Sie diese zusammenfügen möchten, benötigen Sie eine eindeutige Möglichkeit, die Zeilen zwischen den Tabellen zu identifizieren.

A Distinct sollte es bis zu 2 Datensätze zurückbringen:

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

Das Ergebnis hat sich bei Verwendung von DISTINCT – vuyy1182

+0

@ vuyy1182 nicht geändert. Welche Spalte ist in den Zeilen unterschiedlich? – paqogomez

+0

Es ist ** Suff ** Spalte – vuyy1182

2

Sie erhalten Duplikate, weil beide Datensätze in der Tabelle Things eine BNO-CSCcode von 5.560 bis 04.020 haben, wie in der Tabelle Mapp beide Datensätze tun. Der einzige Unterschied zwischen den beiden, den ich sehen kann, ist das Feld Description. Also, wenn Sie die folgende Abfrage verwenden:

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 

... sollten Sie die Duplizierung beseitigen. Die Verwendung eines Felds, das offensichtlich ein Textfeld in einem Join ist, ist jedoch keine bewährte Methode, da es sich um eine vom Benutzer generierte Datei handelt, deren Übereinstimmung unwahrscheinlich ist, und es dauert länger (relativ gesehen), Felder mit zu vergleichen eine höhere Bytezahl als die mit niedrigen Bytezahlen.

+0

Nicht ** Beschreibung ** Feld ist diffirent. ** Suff ** ist anders. Aber das ist nicht in der Mapping-Tabelle vorhanden. – vuyy1182

+0

Was meinen Sie mit "Nicht Beschreibung Feld ist anders"? Willst du damit sagen, dass Platten in 'Mapp' nicht unbedingt die gleichen' 'Description' 'wie in' Things' haben? –