MS SQL de mise à jour de la table avec plusieurs conditions
Été la lecture de ce site pour avoir des réponses pour un bon moment et maintenant de poser ma première question!
Je suis à l'aide de SQL Server
J'ai deux tables, ABC et ABC_Temp.
Le contenu est inséré dans le ABC_Temp d'abord avant de faire son chemin à l'ABC.
Tableau ABC et ABC_Temp ont les mêmes colonnes, sauf que ABC_Temp a une colonne supplémentaire appelé LastUpdatedDate, qui contient la date de la dernière mise à jour. Parce que ABC_Temp pouvez avoir plus de 1 du même dossier, il a une clé composite de l'article et le numéro de la dernière date de mise à jour.
Les colonnes sont: ItemNo | Prix | Qté et ABC_Temp a une colonne supplémentaire: LastUpdatedDate
Je veux créer une déclaration qui suit les conditions suivantes:
- Vérifier si chacun des attributs de ABC différer de la valeur de ABC_Temp pour les enregistrements ayant la même clé, si oui, alors faire la mise à jour (Même si un seul attribut est différent, tous les autres attributs peuvent être mis à jour)
- Mettre à jour uniquement ceux qui ont besoin de changements, si le dossier est le même, alors il ne serait pas mise à jour.
- Depuis un élément peut avoir plus d'un enregistrement dans ABC_Temp je veux seulement le dernier jour d'être mis à jour ABC
Je suis actuellement à l'aide de 2005 (je crois, pas au travail à l'heure actuelle).
Ce sera dans une procédure stockée et est appelée à l'intérieur de la VBscript tâche planifiée. Donc, je crois que c'est une fois de temps chose. Aussi, je ne suis pas en train de synchroniser les deux tableaux, comme le contenu de ABC_Temp serait seulement contenir de nouveaux records d'insertion en bloc à partir d'un fichier texte par le biais de la PCA. Pour des raisons de contexte, il est utilisé en conjonction avec un insert procédure stockée qui vérifie si des documents existent.
Prière de décrire le scénario d'usage - est-ce un travail à temps où vous souhaitez synchroniser 2 tables en une seule fois, ou vous projetez de le faire sur un calendrier. Ou vous voulez le faire de manière dynamique à chaque fois qu'un nouvel enregistrement est poussé à ABC_Temp, vous devez mettre à jour ABC.
Ce sera dans une procédure stockée et est appelée à l'intérieur de la VBscript tâche planifiée. Donc, je crois que c'est une fois de temps chose. Aussi, je ne suis pas en train de synchroniser les deux tableaux, comme le contenu de ABC_Temp serait seulement contenir de nouveaux records d'insertion en bloc à partir d'un fichier texte par le biais de la PCA. Pour des raisons de contexte, il est utilisé en conjonction avec un insert procédure stockée qui vérifie si des documents existent
mise à jour de la question, et ajouter un commentaire souligné 🙂
OriginalL'auteur zentenk | 2011-06-23
Vous devez vous connecter pour publier un commentaire.
Si les valeurs NULL sont possibles dans le
price
ouqty
colonnes, alors vous aurez besoin de tenir compte de cela. Dans ce cas, je serais probablement changer l'inégalité des déclarations à ressembler à ceci:Cela suppose que -1 n'est pas une valeur valide dans les données, de sorte que vous n'avez pas à vous soucier réellement y figurant.
Aussi, est ABC_Temp vraiment une table temporaire est juste chargé assez longtemps pour obtenir les valeurs dans l'ABC? Si non, alors vous êtes le stockage des données en double dans plusieurs endroits, ce qui est une mauvaise idée. Le premier problème est que maintenant vous avez besoin de ces types de scénarios de mise à jour. Il y a d'autres problèmes que vous pourriez rencontrer, tels que des incohérences dans les données, etc.
Merci beaucoup, cela a fonctionné pour moi! Mais ce que je ne comprends vraiment pas ce est pourquoi T2.item_no EST NULLE?
La seule façon que T2.item_no peut être NULL (en supposant que c'est une colonne not NULL) si la JOINTURE EXTERNE GAUCHE a échoué à trouver une ligne correspondante. Donc, ce que la requête est dit, ne me donne que ces lignes où vous ne pouvez pas trouver un T2 c'est après la ligne T1... ou, T1 est la dernière ligne. En gros, c'est une autre manière de faire un n'EXISTE PAS
ahhh je vois merci pour l'explication
OriginalL'auteur Tom H
Vous pouvez utiliser
cross apply
à chercher la dernière ligneABC_Temp
avec la même clé. Utiliser unwhere
clause de filtrer les lignes sans différences:Dans l'exemple, seulement
col2
est nullable. Depuisnull <> 1
n'est pas vrai, vous devez vérifier les différences impliquant null à l'aide de lais null
syntaxe.latest.col2 is null
résultat en quelques lignes d'null
si elles ont déjà des valeurs?merci! Je vais l'essayer demain.
OriginalL'auteur Andomar