2017-08-27 1 views
0

Je veux mettre à jour la colonne c5 (à 1) de chaque base de date groupée sur la colonne c1, c2, c3 où c3 est maximum dans le même groupe c1, c2. je travaille avec hql sur oracle dbmise à jour conditionnellement base sur le maximum d'une colonne dans un groupe spécial hql

c1 | c2 | c3 | c4 | c5 | c5 after update 
2000 | a | 01 | x | 0 | 0 
2000 | a | 01 | y | 0 | 0 
2000 | a | 01 | z | 0 | 0 
2000 | a | 02 | z | 0 | 1 
2000 | a | 02 | x | 0 | 1 
........................... 
2000 | b | 01 | x | 0 | 0 
2000 | b | 01 | y | 0 | 0 
2000 | b | 01 | z | 0 | 0 
2000 | b | 02 | z | 0 | 1 
.......................... 
.......................... 
2001 | a | 01 | x | 0 | 0 
2001 | a | 01 | y | 0 | 0 
2001 | a | 01 | z | 0 | 0 
2001 | a | 02 | z | 0 | 0 
2001 | a | 02 | x | 0 | 0 
2001 | a | 02 | y | 0 | 0 
2001 | a | 02 | w | 0 | 0 
2001 | a | 03 | y | 0 | 1 
2001 | a | 03 | w | 0 | 1 
........................... 
2001 | b | 01 | x | 0 | 0 
2001 | b | 01 | y | 0 | 0 
2001 | b | 02 | x | 0 | 1 
2001 | b | 02 | z | 0 | 1 

Répondre

1

Je ne suis pas familier avec hql, mais une recherche rapide sur Google montre qu'il est "similaire" à SQL mais il est orienté objet. Dans votre problème, vous devez mettre à jour une table Oracle standard, relationnelle, de sorte que vous ne comprenez pas pourquoi vous avez besoin ou souhaitez utiliser hql.

Si vous avez accès à la base de données Oracle d'une manière qui peut utiliser des instructions SQL simples, vous pouvez exécuter la mise à jour avec l'instruction MERGE, comme ceci: (en supposant td est le nom de votre table)

merge into td 
    using (select c1, c2, max(c3) as max_c3 
      from  td 
      group by c1, c2 
     ) x 
     on (td.c1 = x.c1 and td.c2 = x.c2 and td.c3 = max_c3) 
when matched then update 
    set c5 = 1 
; 
1

Vous pouvez utiliser des fenêtres de fonction globale max partitionnement par colonne c1, c2 dans case comme ci-dessous pour générer le résultat souhaité.

SELECT t2.c1, 
     t2.c2, 
     t2.c3, 
     t2.c4, 
     CASE 
      WHEN t2.c3 = max(t2.c3) over(partition BY t2.c1, t2.c2 
             ORDER BY t2.c1) THEN 1 
      ELSE 0 
     END AS c5 
FROM table1 t2 
ORDER BY t2.c1, 
     t2.c2, 
     t2.c3 

Résultat

C1  C2 C3 C4 C5 
----------------------- 
2000 a 1 x 0 
2000 a 1 y 0 
2000 a 1 z 0 
2000 a 2 z 1 
2000 a 2 x 1 
2000 b 1 x 0 
2000 b 1 y 0 
2000 b 1 z 0 
2000 b 2 z 1 
2001 a 1 x 0 
2001 a 1 y 0 
2001 a 1 z 0 
2001 a 2 x 0 
2001 a 2 y 0 
2001 a 2 z 0 
2001 a 2 w 0 
2001 a 3 w 1 
2001 a 3 y 1 
2001 b 1 x 0 
2001 b 1 y 0 
2001 b 2 z 1 
2001 b 2 x 1 

Vous pouvez vérifier la démo here

Espérons que cela aidera.

+0

merci beaucoup.Je veux hql mais je pense que je ne peux pas l'écrire avec hql et dois utiliser sql comme vous m'a répondu ... mais pouvez-vous modifier votre réponse à mettre à jour c5 au numéro spécifique (0 ou 1)? (Je ne veux pas sélectionner ... Je veux mettre à jour) – faraa

+1

Oh. J'ai raté la partie mise à jour. Comme c'est déjà écrit par mathguy ci-dessus, donc vous pouvez vérifier cela. cela fonctionnera pour vous, mais vous devez définir la colonne 'c5' sur' default 0' dans ddl. – zarruq

+0

donc je ne peux pas utiliser votre requête (avec quelques modifications) pour mettre à jour? – faraa