Besoin d'aide pour une requête! [SQL][Oracle] - SQL/NoSQL - Programmation
Marsh Posté le 06-09-2002 à 13:12:18
ç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
Marsh Posté le 06-09-2002 à 13:32:44
Ça ne peut pas être le cas:
Code :
|
Ne me renvoie aucune ligne.
Marsh Posté le 06-09-2002 à 13:54:38
Euh ...
et ça ça te renvoie quoi ?
SELECT code_sous_famille , count(*)
FROM sous_famille_t
group by code_sous_famille
having count(*) > 1
;
Marsh Posté le 06-09-2002 à 14:18:36
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.
Marsh Posté le 06-09-2002 à 14:38:39
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.
Marsh Posté le 06-09-2002 à 14:54:00
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
)
;
Marsh Posté le 06-09-2002 à 16:49:29
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. |
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...
Marsh Posté le 06-09-2002 à 19:08:54
Bon, je capte rien à ton code, mais c pas grave
Essaie une requête du genre :
Code :
|
Marsh Posté le 10-09-2002 à 23:15:34
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.
Marsh Posté le 11-09-2002 à 00:59:12
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
Marsh Posté le 11-09-2002 à 11:25:56
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. |
Marsh Posté le 06-09-2002 à 13:02:16
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:
Le problème c'est que j'ai une erreur "Sous-interrogation ramenant un enregistrement de plus d'une ligne"!
Je suis sous Oracle 8.1.7
---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi