Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
730 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête PL/SQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requête PL/SQL

n°2125814
maalicius
Posté le 10-02-2012 à 11:25:54  profilanswer
 

Bonjour à tous,
 
Alors je me permet de vous exposer mon problème.
J'ai une table avec plusieurs champs.
Deux champs en particulier m'interessent, on va les noter champs_1="facility_id" et champs_2="ctpr_id"
avec une petite requête je trouve qu'il y a un certain nombre d'élément de champs_2 qui ont plusieurs éléments de champs_1
Je m explique:
En faisant :
 
select ctpr_id, count(facility_id) from Table where run_id='11517'
group by ctpr_id  
 
je trouve:
 
ctpr_id                              count(facility_id)
_______________________________________
PA1075FL410057701### 1
MOD458230633              179
PA1000CC024822934 3
PA1000CC001177934 2
MOD458023914              1
MOD458243796              79
PA1000CC076724844 1
PA1000CC002067634 1
PA1000CC066755214 1
 
Je n'ai pas tout affiche.
 
Mon problème est le suivant:
je veux pour chaque ctpr_id tel que count(facility_id)>1 il faut que je crée une nouvelle ctpr_id dans la table que j'associerai a une facility_id de tel façon qu'à la fin en faisant le count pour chaque ctpr_id je n'aurai qu'une facility_id.
 
Est ce que c'est faisable qu'avec des requête sql ou faudra utiliser un script PL/SQL?
 
Si vous avez des pistes n'hésitez pas.
 
Merci pour le temps que vous allez prendre pour lire ce poste et pour vos réponses.
 
 

mood
Publicité
Posté le 10-02-2012 à 11:25:54  profilanswer
 

n°2126095
Sve@r
Posté le 13-02-2012 à 02:03:19  profilanswer
 

maalicius a écrit :

En faisant : select ctpr_id, count(facility_id) from Table where run_id='11517'
group by ctpr_id


Salut
Déjà ta requête est mal formulée car elle laisse croire à ceux qui la lisent que tu veux compter les facility_id alors qu'en réalité elle compte les cptr_id identiques. Donc tu aurais pu écrire

Code :
  1. select ctpr_id, count(cptr_id) from Table where run_id='11517' group by ctpr_id


ou bien encore plus simple

Code :
  1. select ctpr_id, count(*) from Table where run_id='11517' group by ctpr_id


Ce qui aurait produit le même résultat.
 

maalicius a écrit :

Mon problème est le suivant:
je veux pour chaque ctpr_id tel que count(facility_id)>1 il faut que je crée une nouvelle ctpr_id dans la table que j'associerai a une facility_id de tel façon qu'à la fin en faisant le count pour chaque ctpr_id je n'aurai qu'une facility_id.
 
Est ce que c'est faisable qu'avec des requête sql ou faudra utiliser un script PL/SQL?


Il te faut passer par un script. Lui seul peut partir d'un select pour récupérer le résultat, le modifier (car tu changes l'id) et updater la ligne... sauf si ton cptr_id est associé à un auto-incrément. Dans ce cas tu peux faire un

Code :
  1. update Table set cptr_id=default where cptr_id in (select cptr_id from Table where run_id='11517' group by cptr_id having count(*) > 1)


Message édité par Sve@r le 13-02-2012 à 02:06:14
n°2126202
maalicius
Posté le 13-02-2012 à 11:41:38  profilanswer
 

Salut,
 
Merci beaucoup pour ta réponse.
le count(facility_id) était fait exprès pour calculer combien il y a de facility pour chaque contreparty, mais en effet ta requête est plus juste.
Sinon j'ai réussi à trouver une solution en faisant un insert qui va créer un nouveau CTPR_ID pour chaque facility_ID.
J'ai juste un petit souci, je n'arrive à le faire pour un certain nombre de ctpr_id car la longueur est de 20 maximum et moi ce que je fait je rajoute un "||'_'||rownum".
Je ne sais pas s'il y a une solution pour régler ce petit problème sachant que je n'ai pas le droit de toucher au caractéristique des champs.
Ma solution j'ai l impression qu'elle est trop compliqué:
1- je commence par faire un insert et rajouter toutes les contreparties qui ne dépassent pas les 20 caractères.
2- je fais un update pour recopier les champs qui risquent de dépasser les 20 caractère dans un autre champs.
3- je refais l'étape 1 mais je le fais que pour les ctpr_id qui risquaient de dépasser les 20 caractères.
 
Si tu pense qu'il y a une autre solution, n'hésite pas. Si jamais tu as besoin de mon code actuel, je pourrai te l envoyer.
 
Merci d'avance

n°2126253
maalicius
Posté le 13-02-2012 à 15:05:31  profilanswer
 

re,
 
Je pense que j'ai résolu le problème en une étape mais c'est quand même assez barbare mais j aurai voulu savoir s'il y a une façon plus optimisé de foruler la requète suivante :
 
UPDATE T1
SET (COL1,COL2,COL3...) = (SELECT COL1, COL2,COL3 FROM T2 WHERE T1.PK = T2.PK)
WHERE EXISTS (SELECT 1 FROM T2 WHERE T2.PK=T1.PK)
 
ça fait plus de 10 minutes que j'ai lancé la requête et c'est toujours pas fini, surtout que j ai plus d'un million de ligne, j ai peur que ça prenne toute l'après midi.
le where exists a été rajouté pour palier l'erreur 'Contraint non null'
 
Merci d'avance


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête PL/SQL

 

Sujets relatifs
[MySQL] Besoin d'aide pour une requete UPDATE[MySQL] Problème d'exécution d'une requête SQL
Perl: afficher le résultat d'une requête sqlPerformances Curseur / Complexité requête SQL
[Résolu] [SGBD/SQL] Import MySQL et caractères spéciaux[Oracle] paramètres was_captures=NO dans $SQL_CAPTURE_BIND
Renommer une colonne en SQL ACCESS 2003Gestion d'une Requête SQL grâce à JCBD
PL/SQL : utilisation de variable pour liste de valeur dans requête 
Plus de sujets relatifs à : Requête PL/SQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR