0
votes

Comment mettre à jour un enregistrement en vérifiant une valeur dans un autre enregistrement de la même table

J'ai une table:

ID      DATE            RANGE       STATUS
--------------------------------------------
123     30-SEP-2019     000         C
123     30-SEP-2019     001         NULL
345     25-SEP-2019     000         C
345     30-SEP-2019     001         NULL
567     30-SEP-2019     000         C
567     30-SEP-2019     001         NULL
789     27-SEP-2019     000         C
789     30-SEP-2019     001         NULL

Enregistrements avec le même ID (par exemple, 123) considérés comme le même enregistrement avec une PLAGE différente. Je dois mettre à jour le STATUS des enregistrements 001 RANGE sur Y pour lequel l'enregistrement 000 RANGE doit avoir la date 30-SEP-2019.

Ex. La requête de mise à jour doit mettre à jour le STATUS à 'Y' pour l'enregistrement avec l'ID - '123' et RANGE - '001', car pour l'ID - '123' avec le RANGE - la DATE de l'enregistrement '000' est '30 -SEP- 2019 '. Il doit également mettre à jour le STATUS de l'enregistrement 001 RANGE avec l'ID - 567.

Il ne doit pas mettre à jour le STATUS de 001 RANGE pour les ID 789 et 345, car la DATE de l'enregistrement 000 RANGE n'est pas égale à 30 -SEP-2019.

Comment puis-je y parvenir?


0 commentaires

3 Réponses :


1
votes

Une sous-requête corrélée avec filtrage me vient à l'esprit:

update t
    set status = (select t2.status
                  from t t2
                  where t2.id = t.id and t2.range = '000'
                 )
    where date = '2019-09-30' and range = '001';


1 commentaires

Merci pour votre réponse, mais désolé la question était erronée, je dois mettre à jour le statut comme Y



0
votes

Alternativement, si la réponse de Gordon est correcte, vous pouvez utiliser un JOIN:

UPDATE T1
SET status = T2.Status
FROM YourTable T1
     JOIN YourTable T2 ON t1.id = t2.id
WHERE T1.[date] = '20190930'
  AND T1.range = '001'
  AND T2.range = '000';


0 commentaires

0
votes

Faites une mise à jour avec une auto-jointure:

 ID | DATE        | RANGE | STATUS
--: | :---------- | ----: | :-----
123 | 30-SEP-2019 |     0 | C     
123 | 30-SEP-2019 |     1 | Y     
345 | 25-SEP-2019 |     0 | C     
345 | 30-SEP-2019 |     1 | null 
567 | 30-SEP-2019 |     0 | C     
567 | 30-SEP-2019 |     1 | Y     
789 | 27-SEP-2019 |     0 | C     
789 | 30-SEP-2019 |     1 | null

Vous pouvez ajouter des conditions dans une clause WHERE spécifiquement pour les plages que vous souhaitez modifier comme:

WHERE t.range = '001' and tt.range = '000'


0 commentaires