2010-07-14 6 views
0

J'écris une procédure stockée qui devrait synchroniser une table de notre environnement de production à notre environnement de test (une fois par jour). J'ai 2 tables. Pour le rendre facile, appelons-les Mètres et Mesures. Je veux garder les mesures synchronisées et supposer que je peux ajouter manuellement un compteur à mon environnement de test. Meter_id peut se désynchroniser entre les deux bases de données, mais Location ne change pas.MERGE INTO Avec entre production et test où les tables à fusionner ont besoin d'une jointure

J'ai mis en place un lien de base de données vers notre serveur de test appelé db_test. Maintenant, je voudrais utiliser une instruction de fusion pour mettre à jour Mesures @ db_test

MERGE INTO [email protected]_test meas_test 
USING Measurements meas 
    ON (???) 
WHEN MATCHED THEN 
    -- Do update 
WHEN NOT MATCHED THEN 
    -- Do insert 

Je pensais dans cette direction ...

MERGE INTO [email protected]_test meas_test 
USING (SELECT value, location 
     FROM meters mtr, measurements meas 
     WHERE mtr.meter_id = meas.meter_id AND 
     MeasurementTime > sysdate - 1) meas_new 
ON (meas_new.location = ??? AND 
    meas_new.value = meas_test.value AND 
    meas_new.MeasurementTime = meas_test.MeasurementTime)    
WHEN MATCHED THEN 
    -- Do update 
WHEN NOT MATCHED THEN 
    -- Do insert 

Alors, comment puis-je jeter les joindre à la table des compteurs afin que Je suis sûr qu'ils correspondent sur place et non sur ID

Répondre

2

Vous ne pouvez pas vous joindre à la table Meters de l'environnement de test sur le lien? Comme ceci:

MERGE INTO [email protected]_test meas_test 
USING (SELECT mtr_test.meter_id, meas.value, meas.measurementtime 
     FROM meters mtr, measurements meas, [email protected]_test mtr_test 
     WHERE mtr.meter_id = meas.meter_id 
      AND mtr_test.location = mtr.location 
      AND meas.measurementtime > sysdate - 1) meas_new 
    ON (meas_new.meter_id = meas_test.meter_id 
     AND meas_new.value = meas_test.value 
     AND meas_new.measurementtime = meas_test.measurementtime) 
WHEN MATCHED THEN 
     -- Do update 
WHEN NOT MATCHED THEN 
     -- Do insert 
+0

Je suppose que ça devrait être ça. Je pensais que vous ne pourriez pas utiliser l'alias meas_test à l'intérieur de l'USING (sous-sélection) et y déposer la jointure. Mais en y réfléchissant, cela pourrait fonctionner. Je vais essayer lundi, mais je l'accepterai comme la bonne réponse. Merci. –

Questions connexes