checksum

Le
Christophe
bonjour,

j'ai une table avec des personnes, sur laquelle je dois comparer les champs
suivants :
nom
prenom
adresse3
code postal
ville

la table comporte 1 million de lignes.
Pour gagner du temps j'ai donc creer une champ integer.
suivant

checksum( isnull(nom,'') + isnull(prenom,'') + isnull(adresse3,'') +
isnull(CP,'') + isnull(ville,'') )
se qui me donne un integer bien plus simple et rapide à comparer.
seulement voila j'ai plusieurs fois le meme numero pour des personnes qui
n'ont rien à voir entre elle.
bien sur cela me creer de grave problemes d'affectation.


est-ce que je suis parti dans la mauvaise direction ?
qu'utiliseriez vous comme methode pour repondre à mon besoin ?
y'a t'il des limitation à la fonction checksum ?


Merci par avance !
Ch.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred BROUARD
Le #11856461
Christophe a écrit :
bonjour,

j'ai une table avec des personnes, sur laquelle je dois comparer les
champs suivants :
nom
prenom
adresse3
code postal
ville

la table comporte 1 million de lignes.
Pour gagner du temps j'ai donc creer une champ integer.
suivant

checksum( isnull(nom,'') + isnull(prenom,'') + isnull(adresse3,'') +
isnull(CP,'') + isnull(ville,'') )
se qui me donne un integer bien plus simple et rapide à comparer.
seulement voila j'ai plusieurs fois le meme numero pour des personnes
qui n'ont rien à voir entre elle.
bien sur cela me creer de grave problemes d'affectation.


est-ce que je suis parti dans la mauvaise direction ?
qu'utiliseriez vous comme methode pour repondre à mon besoin ?
y'a t'il des limitation à la fonction checksum ?




Checksum ne garantie pas l'unicité sur des chaînes très longues.

Mais vous pouvez quand même ce faire en ajoutant le double contrôle :


SELECT *
FROM
(
SELECT *
FROM MaTable
WHERE MonCheckSum = 5623131321
) T
WHERE nom = 'toto'
AND prenom = 'marcel'
AND ...

A +



Merci par avance !
Ch.







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Christophe
Le #11856441
Merde c'est pas cool ce que tu me dis la, ca doit venir de la le probleme,
ou j'ai des doublons de checksum alors que ces personnes non strictement
rien à voir !

quelles autres methode je pourrais utiliser ? car le probleme c'est que
confronter quelques milliers de ligne à plus d'un million ca prends quand
meme un certain temps et j'aurais le cas tres prochainement pour des bases
bien plus lourde !
4 millions sur 20 millions !!

cette solution m'avait bien plus.


"Fred BROUARD" news:
Christophe a écrit :
bonjour,

j'ai une table avec des personnes, sur laquelle je dois comparer les
champs suivants :
nom
prenom
adresse3
code postal
ville

la table comporte 1 million de lignes.
Pour gagner du temps j'ai donc creer une champ integer.
suivant

checksum( isnull(nom,'') + isnull(prenom,'') + isnull(adresse3,'') +
isnull(CP,'') + isnull(ville,'') )
se qui me donne un integer bien plus simple et rapide à comparer.
seulement voila j'ai plusieurs fois le meme numero pour des personnes qui
n'ont rien à voir entre elle.
bien sur cela me creer de grave problemes d'affectation.


est-ce que je suis parti dans la mauvaise direction ?
qu'utiliseriez vous comme methode pour repondre à mon besoin ?
y'a t'il des limitation à la fonction checksum ?




Checksum ne garantie pas l'unicité sur des chaînes très longues.

Mais vous pouvez quand même ce faire en ajoutant le double contrôle :


SELECT *
FROM
(
SELECT *
FROM MaTable
WHERE MonCheckSum = 5623131321
) T
WHERE nom = 'toto'
AND prenom = 'marcel'
AND ...

A +



Merci par avance !
Ch.







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************


Fr
Le #11856431
Bonjour,

Peut-être que un hashage MD5 en lieu et place du checksum ferai l'affaire...
par contre cela est plus lourd à stocker et certaiement plus long à calculer
qu'un checksum (à vérifier)

declare @s nvarchar(4000)
Set @s=isnull(nom,'') + isnull(prenom,'') + isnull(adresse3,'') +
isnull(CP,'') + isnull(ville,'')

puis stocker le résultat de HashBytes('MD5', @s) dans une colonne varchar




"Christophe" news:
bonjour,

j'ai une table avec des personnes, sur laquelle je dois comparer les
champs suivants :
nom
prenom
adresse3
code postal
ville

la table comporte 1 million de lignes.
Pour gagner du temps j'ai donc creer une champ integer.
suivant

checksum( isnull(nom,'') + isnull(prenom,'') + isnull(adresse3,'') +
isnull(CP,'') + isnull(ville,'') )
se qui me donne un integer bien plus simple et rapide à comparer.
seulement voila j'ai plusieurs fois le meme numero pour des personnes qui
n'ont rien à voir entre elle.
bien sur cela me creer de grave problemes d'affectation.


est-ce que je suis parti dans la mauvaise direction ?
qu'utiliseriez vous comme methode pour repondre à mon besoin ?
y'a t'il des limitation à la fonction checksum ?


Merci par avance !
Ch.





Fred BROUARD
Le #11856401
Christophe a écrit :
Merde c'est pas cool ce que tu me dis la, ca doit venir de la le probleme,
ou j'ai des doublons de checksum alors que ces personnes non strictement
rien à voir !

quelles autres methode je pourrais utiliser ? car le probleme c'est que
confronter quelques milliers de ligne à plus d'un million ca prends quand
meme un certain temps et j'aurais le cas tres prochainement pour des bases
bien plus lourde !
4 millions sur 20 millions !!



la requête que je vous ais donné va parfaitement fonctionner.

A +


cette solution m'avait bien plus.


"Fred BROUARD" news:
Christophe a écrit :
bonjour,

j'ai une table avec des personnes, sur laquelle je dois comparer les
champs suivants :
nom
prenom
adresse3
code postal
ville

la table comporte 1 million de lignes.
Pour gagner du temps j'ai donc creer une champ integer.
suivant

checksum( isnull(nom,'') + isnull(prenom,'') + isnull(adresse3,'')
+ isnull(CP,'') + isnull(ville,'') )
se qui me donne un integer bien plus simple et rapide à comparer.
seulement voila j'ai plusieurs fois le meme numero pour des personnes
qui n'ont rien à voir entre elle.
bien sur cela me creer de grave problemes d'affectation.


est-ce que je suis parti dans la mauvaise direction ?
qu'utiliseriez vous comme methode pour repondre à mon besoin ?
y'a t'il des limitation à la fonction checksum ?




Checksum ne garantie pas l'unicité sur des chaînes très longues.

Mais vous pouvez quand même ce faire en ajoutant le double contrôle :


SELECT *
FROM
(
SELECT *
FROM MaTable
WHERE MonCheckSum = 5623131321
) T
WHERE nom = 'toto'
AND prenom = 'marcel'
AND ...

A +



Merci par avance !
Ch.







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Publicité
Poster une réponse
Anonyme