2017-03-09 3 views
1

Je tente de gauche joindre deux tables sur le même serveur mais différentes bases de données en utilisant un champ intitulé «bon». Les champs contiennent exactement les mêmes données mais sont stockés sous différents types de données. Sur la table a, le bon est stocké en tant que nvarchar et sur la table b il est stocké en tant que char.Rejoindre sur le même champ, le type de données différent

Lorsque j'exécute ma requête, j'obtiens beaucoup de valeurs nulles pour le bon de la table b. Si j'exécute des requêtes sur les tables séparément, je peux voir les valeurs de la table b qui apparaissent comme des valeurs nulles sur la requête jointe.

Toute aide ici serait énorme.

+1

Pouvez-vous ajouter des exemples de données et le résultat souhaité? – McNets

+0

A.Acct # A.VOUCHER \t B.Acct # \t B.Voucher 123456789 UXXXXXXXX NULL NULL 123456789 UXXXXXXXX NULL NUL Ci-dessus est ce que je reçois actuellement. Je m'attendrais à ce que les valeurs de la table b remplissent les mêmes données. Voici ma jointure: left join tableB sur tableb.voucher = tablea.voucher. Comme je l'ai déjà mentionné, mêmes données mais type de données différent. – bwrow24

+1

S'il vous plaît * modifier * votre question, n'ajoutez pas de détails supplémentaires dans une section de commentaire :) – bc004346

Répondre

0

Le type Char comporte des espaces ajoutés pour remplir la longueur de la colonne. Vous devez découper le champ char tout en joignant comme:

left join tableB on rtrim(tableb.voucher) = tablea.voucher 
+0

résultats: gauche joindre #b sur ltrim (rtrim (b.VOUCHER)) = ltrim (rtrim (# a.VOUCHER)) – bwrow24

+0

J'ai essayé juste le rtrim sur la table b comme suggéré ci-dessus mais je reçois toujours la même quantité de nulls. – bwrow24

+0

Pouvez-vous également essayer de supprimer les caractères d'entrée?J'ai eu de tels cas avant. –

0

Ces deux types de données doivent implicitement convertir dans la plupart des bases de données. Il ne se souciera pas des espaces que le char ajoute.

Parfois, les données ne sont pas identiques, même si elles sont identiques. Voir le code ci-dessous pour le serveur SQL (je montre les résultats des jeux pour ceux qui ne l'aide Sql Server):

Créer les données

create table #temp (id varchar (10)) 
create table #temp2 (id char(10)) 
truncate table #temp2 
insert into #temp values ('test1') 
insert into #temp values ('test' +Char(13)) 
Insert into #temp2 values ('test1') 
insert into #temp2 values ('test') 

Query

select * from #temp 

Les données retournées

id 
test1 
test 

Requête # Temp2

select * from #temp2 

données Retourné

id 
test1  
test  

requête de jointure

select t.id as tid , t2.id as t2id from #temp t 
left join #temp2 t2 on t.id = t2.id 

données Retourné

tid  t2id 
test1 test1  
test NULL 

Comme vous pouvez le voir, si vous exécutez ce, que l'ajout d'un caractère non imprimable (dans ce cas un retour chariot) rend les valeurs ne correspondent plus dans la jointure. Si vous avez de telles données dans votre tableau, les valeurs ne sont pas les mêmes. Pour être plus précis quant à un correctif, je devrais savoir quel backend de base de données vous utilisez.

+0

J'utilise SQL Server Management Studio 2012. – bwrow24

+0

Est-ce que cela aide ou avez-vous besoin de plus d'informations pour suggérer un correctif spécifique? – bwrow24

+0

La question est maintenant de savoir si vous devez nettoyer les données elles-mêmes (et écrire une correction à l'application pour empêcher les caractères non imprimables de s'infiltrer) ou devez-vous garder ces caractères dans la ou les tables qui les contiennent ? – HLGEM