2009-09-23 5 views
0

J'ai 2 tables avec beaucoup d'enregistrements (tableau 1) et une seconde (tableau 2) avec des données similaires mais avec beaucoup moins d'enregistrements.Vérification des données dans une table volumineuse par rapport à une table plus petite

Sur une base régulière, j'ai besoin d'ajouter un marqueur aux enregistrements dans la plus grande table où il y a un enregistrement correspondant dans la plus petite table. Par exemple, cela pourrait être une adresse e-mail.

Donc, si l'adresse e-mail existe dans la table plus petite (tableau 2) marquer cela dans la plus grande table (tableau 1)

Maintenant, je sais que cela est un peu vague, mais les données réelles nest pas pertinentes ni table/noms de colonne. Ce que je suis à la recherche d'idées/suggestions est le moyen le plus efficace de le faire.

-je exécuter une procédure qui ....

A) vérifie un enregistrement d'une table, pour ensuite rechercher un enregistrement correspondant dans l'autre? Puis marque cet enregistrement s'il a une correspondance. Quel chemin est le meilleur?

B) Faire quelque chose avec des tables temporaires?

c) quelque chose de totalement différent? S'il vous plaît donner des pointeurs. J'espère que cela a du sens et j'espère que vous pourrez nous aider.

Merci!

Répondre

6

Effectuez une MISE À JOUR qui consiste en une INNER JOIN entre les deux tables sur l'adresse électronique.

+0

Bonne idée, mais je n'aurais pas su comment sans l'exemple de CJM. Merci ;-) – Munklefish

1

Puisque vous êtes sur SQL 2005, vous ne pouvez pas utiliser la commande MERGE. Vous devez utiliser une instruction INSERT et une instruction UPDATE pour cela. Une fois que vous avez écrit le SQL pour ce faire, vous pouvez créer un Job SQL qui exécute périodiquement cette instruction et la planifie.

Voici comment planifier un emploi: http://msdn.microsoft.com/en-us/library/ms190268.aspx

+0

Raj, Merci pour cela. Je connais déjà la planification et c'est vraiment utile. – Munklefish

2

grosso modo, faire quelque chose comme ceci:

Update LargeTable 
Set Marker = 1 
From LargeTable l 
inner join SmallTable s 
on s.ID = l.ID 
Where s.SomeField = 'Criteria' 
+0

Hmmm! Excellente suggestion merci. Semble être une méthode très efficace (à partir de mes connaissances limitées) ;-) – Munklefish

+0

vous devriez être compatible avec votre utilisation des alias, _UPDATE l SET l.Marque = 1 FROM LargeTable l INNER JOIN _.... –

+0

@KM - il n'y a pas besoin d'un alias dans l'instruction SET, car il ne peut s'appliquer qu'à la cible de l'instruction UPDATE. S'il n'y a pas d'ambiguïté, il n'y a pas besoin de clarification. De toute évidence, votre suggestion ne fait aucun mal, mais je ne vois personnellement aucun avantage. – CJM

1

Pourquoi ne pas créer un déclencheur qui mettra automatiquement à jour la première table lorsqu'un enregistrement est mis en , supprimé ou modifié dans la seconde table. Ou mieux encore, pourquoi ne pas simplement rejoindre la deuxième table lorsque vous voulez connaître cette information au lieu de dénormaliser pour stocker dans le premier?

+0

Il y a souvent des cas de dénormalisation (dans une certaine mesure ou autre), mais en général je pense que vous faites des bons points. – CJM

+0

Chaque fois que vous dénormaliser comme ceci, vous devez configurer un déclencheur pour vous assurer que les données restent synchronisées. ou bien une table aura des données périmées. – HLGEM

+0

soit tableau peut être mis à jour à tout moment d'où le problème. Toute suggestion sur la façon dont les déclencheurs seraient utiles serait appréciée. Merci. – Munklefish

Questions connexes