Bonjour,

Je tombe sur une requête qui est trop complexe pour moi.

J'ai un 3 table liées de cette façon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
select ob.node_id, d.table_name, count(*)
 from sym_outgoing_batch ob
 left join sym_data_event de on de.batch_id=ob.batch_id
 left join sym_data d on d.data_id=de.data_id
where ob.status != 'OK' and d.event_type='R' 
group by ob.node_id, d.table_name
La requête ci-dessus compte le nombre de batch (sym_outgoing_batch) de type 'R' dont le status est !='OK', par node_id.

Je voudrais mette à jours le status de tous les batch sauf le plus récent par node_id et table_name. La table sym_outgoing_batch contient le champs last_update_time pour les trier par date

Par exemple, s'il y a 10 lignes pour le node_id=0001 et la table='ma_table', alors je voudrais changer leur statut à 'OK' sauf pour la plus récente de ces 10 lignes.

La requête suivante récupère la date du batch le plus récent pour chaque couple node_id/table_name, mais je ne n'arrive à récupérer son identifiant batch_id.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
select ob.node_id, d.table_name, max(ob.last_update_time)
 from sym_outgoing_batch ob
 left join sym_data_event de on de.batch_id=ob.batch_id
 left join sym_data d on d.data_id=de.data_id
  where ob.status!='OK' and d.event_type='R' 
 group by ob.node_id, d.table_name
Je voudrais arriver à quelque du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
update sym_outgoing_batch ob
    set status='OK'
from sym_data_event de
left join sym_data d on d.data_id=de.data_id
where de.batch_id=ob.batch_id and ob.status!='OK' and d.event_type='R' 
    and ob.batch_id not in (Liste des batch_id les plus récent par node_id/table_name)
(je ne suis pas certain non plus de ma requête d'update avec jointure ci-dessus, c'était plus pour exprimer ce à quoi je voulais parvenir)

Merci par avance.