J'ai une table de transaction qui contient une colonne transactionId qui a des valeurs comme | H000021 | B1 | .
Je dois faire une jointure avec la table Category qui a une colonne CategoryID avec des valeurs comme H000021 .
Je ne peux pas appliquer de jointure sauf si les données sont identiques.
Je souhaite donc fractionner ou supprimer les données inutiles contenues dans TransctionId afin de pouvoir joindre les deux tables.
Veuillez m'aider avec les solutions.
3 Réponses :
Vous devez corriger vos données afin que les colonnes soient identiques. Mais parfois, nous sommes coincés avec les mauvaises décisions de conception des autres. En particulier, les données de transaction doivent contenir une colonne pour la catégorie - même si la catégorie fait partie de l'id.
Dans tous les cas:
select . . .
from transaction t join
category c
on categoryid = substring(transactionid, 2, 7)
Ou si le l'identifiant de la catégorie est toujours composé de 7 caractères:
select . . .
from transaction t join
category c
on transactionid like '|' + categoryid + |%';
Vous pouvez le faire en utilisant la requête:
CREATE TABLE #MyTable (PrimaryKey int PRIMARY KEY, KeyTransacFull varchar(50) ); GO CREATE TABLE #MyTransaction (PrimaryKey int PRIMARY KEY, KeyTransac varchar(50) ); GO INSERT INTO #MyTable SELECT 1, '|H000021|B1|' INSERT INTO #MyTable SELECT 2, '|H000021|B1|' INSERT INTO #MyTransaction SELECT 1, 'H000021' SELECT * FROM #MyTable SELECT * FROM #MyTransaction SELECT * FROM #MyTable JOIN #MyTransaction ON KeyTransacFull LIKE '|'+KeyTransac+'|%' DROP TABLE #MyTable DROP TABLE #MyTransaction
Créez une colonne calculée avec le code uniquement.
Scénario initial:
select * from Transactions t inner join Category c on t.transactionId_code = c.transactionId
Ajouter une colonne calculée:
alter table Transactions add transactionId_code as substring(transactionid, 2, 7) persisted
Rejoignez en utilisant la nouvelle colonne calculée:
create table Transactions ( transactionId varchar(12) primary key, whatever varchar(100) ) create table Category ( transactionId varchar(7) primary key, name varchar(100) ) insert into Transactions select'|H000021|B1|', 'Anything' insert into Category select 'H000021', 'A category'
Obtenez un plan de requête simple:
Quelles sont les valeurs réelles de | H000021 | B1 | si | fait également partie de ce nombre.
Même si vous utilisez
STRING_SPLITou une autre technique pour extraire les valeurs, les performances en souffriront car aucun index surtransactionIDne peut être utilisé. Vous devez soit corriger la mauvaise conception, soit ajouter une colonne calculée qui extrait lecategoryIDet le recouvrir d'un index