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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL][Oracle]Besoin d'aide pour une requête!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL][Oracle]Besoin d'aide pour une requête!

n°209892
Krueger
tout salaire demande dutravail
Posté le 06-09-2002 à 13:02:16  profilanswer
 

Bonjour,
 
J'ai trois tables:
famille (code_famille, designation)
sous_famille (code_sous_famille, designation, code_famille)
famille_tmp (code_sf, designation_f)
 
Chaque sous-famille appartient à une seule famille.
code_sf doit correspondre à code_sous_famille.
designation_f doit correspondre à famille.designation.
Chaque famille.designation est différente des autres.
 
Alors j'ai des lignes dans la table sous_famille où code_famille n'a pas de valeur. Je souhaite lui en donner une en utilisant les deux autres tables.
Voilà ma requête:

Code :
  1. UPDATE sous_famille
  2. SET code_famille = (
  3.    SELECT DISTINCT f.code_famille
  4.    FROM famille f, famille_tmp ft
  5.    WHERE code_sous_famille = ft.code_sf
  6.    AND ft.designation_f = f.designation
  7.   )
  8. ;


 
Le problème c'est que j'ai une erreur "Sous-interrogation ramenant un enregistrement de plus d'une ligne"!
:cry:
 
Je suis sous Oracle 8.1.7


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
mood
Publicité
Posté le 06-09-2002 à 13:02:16  profilanswer
 

n°209897
vttman2
Je suis Open ...
Posté le 06-09-2002 à 13:12:18  profilanswer
 

ça veut dire que pour une sous-famille donnée
tu as (sur 1 ou certains cas) plusieurs familles
rattachées, le message est normal ....  :(  
 
Déjà dans ta requête tu mets un distinct, ce
qui indique que tu t'attends à remonter
plusieurs valeurs ... familles  
 
Ou alors t'as une erreur de syntaxe ?
 
ex : sous-famille A -> Famille X
     sous-famille A -> Famille Y
     sous-famille B -> Famille X    

n°209904
Krueger
tout salaire demande dutravail
Posté le 06-09-2002 à 13:32:44  profilanswer
 

Ça ne peut pas être le cas:

Code :
  1. SELECT code_sous_famille
  2. FROM sous_famille_t
  3. MINUS
  4. SELECT DISTINCT code_sous_famille
  5. FROM sous_famille_t
  6. ;


Ne me renvoie aucune ligne.


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
n°209915
vttman2
Je suis Open ...
Posté le 06-09-2002 à 13:54:38  profilanswer
 

Euh ...
 
et ça ça te renvoie quoi ?
 
SELECT code_sous_famille , count(*)  
  FROM sous_famille_t  
group by   code_sous_famille  
having count(*) > 1
;  

n°209925
_Mac_
Posté le 06-09-2002 à 14:18:36  profilanswer
 

Ton erreur vient du fait qu'en SQL, quand on fait un UPDATE, on est censé mettre à jour 1 ligne à la fois ; En gros, quand tu fais "SET colonne = ", Oracle (et tous les autres SGBD) s'attend à ce qu'à droite du signe = il y n'ait qu'une seule valeur. Le problème, c'est que ta sous-requête ramène plusieurs valeurs.
 
La solution, c'est réécrire ta sous-requête pour qu'elle ne ramène qu'une valeur à la fois. La première chose à faire, c'est lier ta sous-requête au "UPDATE" en utilisant un alias :
 
UPDATE sous_famille sf SET code_famille =
       (SELECT f.code_famille FROM famille f, famille_tmp ft
        WHERE ft.code_sf = sf.code_sous_famille ...)
 
Après, faut gérer le cas où la famille apparaît plusieurs fois dans la table famille_tmp. Ca va se faire simplement en rajoutant un "AND rownum = 1" dans la close WHERE de ta sous-requête. Dans ce cas-là, tu ne récupèreras que la première ligne du SELECT.
 
Vérifie la syntaxe à utiliser pour l'alias, je ne m'en souviens plus trop.

n°209937
Krueger
tout salaire demande dutravail
Posté le 06-09-2002 à 14:38:39  profilanswer
 

vttman2 > Aucune ligne non plus.
 
_mac_ > Ce qui me pose vraiment problème c'est que code_sous_famille dans la clause WHERE est censée désigner la colonne de la ligne en cours de mise à jour. Du moins c'est ce que je croyais.
 
Dans tous les cas, j'ai fini par trouver une autre solution plus brutale (ajout de colonnes un peu partout), mais qui marche. Mais si quelqu'un pouvait m'éclairer sur ce mécanisme de UPDATE, je suis prenant. :hello:


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
n°209945
vttman2
Je suis Open ...
Posté le 06-09-2002 à 14:54:00  profilanswer
 

:heink:  
Et ça ? tout simplement (sans distinct) !
ça te renvoie une erreur ?
Pasque là niveau syntaxe pour moi ça devrait passer !
 
En clair je pense que le distinct n'a rien à faire
dans cet update !
 
 
  UPDATE sous_famille  
  SET code_famille = (  
      SELECT f.code_famille  
      FROM famille f, famille_tmp ft  
      WHERE code_sous_famille = ft.code_sf  
      AND ft.designation_f = f.designation  
     )  
  ;  

n°210065
_Mac_
Posté le 06-09-2002 à 16:49:29  profilanswer
 

Krueger a écrit a écrit :

vttman2 > Aucune ligne non plus.
 
_mac_ > Ce qui me pose vraiment problème c'est que code_sous_famille dans la clause WHERE est censée désigner la colonne de la ligne en cours de mise à jour. Du moins c'est ce que je croyais.
 
Dans tous les cas, j'ai fini par trouver une autre solution plus brutale (ajout de colonnes un peu partout), mais qui marche. Mais si quelqu'un pouvait m'éclairer sur ce mécanisme de UPDATE, je suis prenant. :hello:
 




 
Bah justement, c'est le principe de l'alias !!! Pour être sur que le code_sous_famille de ton WHERE soit le même que celui du update, tu utilises un alias comme je l'ai montré (en gras).
 
Ou alors, c'est que je n'ai pas compris ce que tu voulais dire...

n°210141
MagicBuzz
Posté le 06-09-2002 à 19:08:54  profilanswer
 

Bon, je capte rien à ton code, mais c pas grave :D
 
Essaie une requête du genre :

Code :
  1. UPDATE sous_famille sf,  famille f, famille_tmp ft
  2.   SET fs.code_famille = f.code_famille
  3.   WHERE sf.code_sous_famille = ft.code_sf
  4.   AND ft.designation_f = f.designation
  5.   ;

n°211910
irulan
Posté le 10-09-2002 à 23:15:34  profilanswer
 

Dans un UPDATE tu ne peut pas mettre à jour une table en faisant une jointure avec une autre table (SISI CAI VRAI). J'ai déjà tourné le problème dans tous les sens, on ne peut pas. Le seul moyen dans ce cas-là c'est une procédure qui met à jour les lignes une à une.
 
Ou alors, mais là c'est vraiment bourrin, tu crées une nouvelle table avec ta fameuse jointure, et tu droppes ensuite la première table que tu voulais updater. Dans ce cas la jointure est autorisée.
 
Je ne sais pas si je suis très clair, donc voilà le truc :
 
TABLE1
------
ID1
CODE_NOM1
NOM1 (champ à updater)
 
TABLE2
------
CODE_NOM2
NOM2
 
La TABLE2 étant supposé être une table de libellés pour l'exemple.
 
Il n'est pas possible de faire :
UPDATE TABLE1
SET NOM1 = (SELECT NOM2 from TABLE2 where CODE_NOM1 = CODE_NOM2)
 
que ce soit en employant des alias ou ce genre de truc.
 
Le seul truc possible est de créer une TABLE3, avec ce genre de commande :
 
CREATE TABLE3 AS SELECT T1.ID1,T1.CODE_NOM1, T2.NOM2
 from TABLE1 T1, TABLE2 T2
 where T1.CODE_NOM1 = T2.CODE_NOM2;
 
Cette TABLE3 respecte la structure et le contenu de la TABLE1, tout en prenant le NOM2 de la TABLE2.
 
Sinon la 'vraie' solution est une procédure en PL/SQL.


Message édité par irulan le 10-09-2002 à 23:15:59
mood
Publicité
Posté le 10-09-2002 à 23:15:34  profilanswer
 

n°211920
MagicBuzz
Posté le 11-09-2002 à 00:59:12  profilanswer
 

irulan a écrit a écrit :

Dans un UPDATE tu ne peut pas mettre à jour une table en faisant une jointure avec une autre table (SISI CAI VRAI). J'ai déjà tourné le problème dans tous les sens, on ne peut pas. Le seul moyen dans ce cas-là c'est une procédure qui met à jour les lignes une à une.
 
Ou alors, mais là c'est vraiment bourrin, tu crées une nouvelle table avec ta fameuse jointure, et tu droppes ensuite la première table que tu voulais updater. Dans ce cas la jointure est autorisée.
 
Je ne sais pas si je suis très clair, donc voilà le truc :
 
TABLE1
------
ID1
CODE_NOM1
NOM1 (champ à updater)
 
TABLE2
------
CODE_NOM2
NOM2
 
La TABLE2 étant supposé être une table de libellés pour l'exemple.
 
Il n'est pas possible de faire :
UPDATE TABLE1
SET NOM1 = (SELECT NOM2 from TABLE2 where CODE_NOM1 = CODE_NOM2)
 
que ce soit en employant des alias ou ce genre de truc.
 
Le seul truc possible est de créer une TABLE3, avec ce genre de commande :
 
CREATE TABLE3 AS SELECT T1.ID1,T1.CODE_NOM1, T2.NOM2
 from TABLE1 T1, TABLE2 T2
 where T1.CODE_NOM1 = T2.CODE_NOM2;
 
Cette TABLE3 respecte la structure et le contenu de la TABLE1, tout en prenant le NOM2 de la TABLE2.
 
Sinon la 'vraie' solution est une procédure en PL/SQL.




En effet, je m'en suis rendu compte chez GE la semaine dernière...
 
Mais c'est vrai aussi pour Oracle 9i :??:
 
Parceque M$ à implémenté ça dans MS SQL 2K et c'est entré dans la norme SQL depuis quelques temps déjà... Etonnant qu'Oracle ne se soit pas mis au goût du jour :??:
 
En tout cas, quand tu peux pas le faire, comme c trop la haine en faite :sweat:

n°212059
Krueger
tout salaire demande dutravail
Posté le 11-09-2002 à 11:25:56  profilanswer
 

irulan a écrit a écrit :

Dans un UPDATE tu ne peut pas mettre à jour une table en faisant une jointure avec une autre table (SISI CAI VRAI). J'ai déjà tourné le problème dans tous les sens, on ne peut pas. Le seul moyen dans ce cas-là c'est une procédure qui met à jour les lignes une à une.



 
:jap:


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi

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

  [SQL][Oracle]Besoin d'aide pour une requête!

 

Sujets relatifs
[dephi] problème d'exécution de resquêtes SQL[mysql] aide avec mysqldump !!!!! urgent !
[SQL Serveur] pb pour démarrer l'agent SQL ![Delphi + sql] Requete sql sous delphi
[PHP] ftp_connect , besoin d'aide![php + regexp] un peu d'aide siouplé c pour manger ....
Oracle Gratuit?Caractère d'échappment dans SQL ?
Convertir les données d'une feuille Excel en requête SQL? Spossible? 
Plus de sujets relatifs à : [SQL][Oracle]Besoin d'aide pour une requête!


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