Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/04/2011, 16h39   #1
Invité de passage
 
Homme
Administrateur de base de données
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Par défaut Erreur requête imbriquée

Bonjour,
Je voudrait solliciter votre avis sur une erreur que j'ai concernant l’exécution d'une requête: ORA-00904 T3.NIV identificateur non valide
le point intriguant est que la même requête s’exécute normalement sur un serveur Windows 2003 et pas sur un serveur Redhat 5, sachant que la version déployée d'Oracle est la même.

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT case t3.nation
            when '001' then 
                 (SELECT t2.nation FROM
                         (SELECT t1.nation,decode(t1.qualite,'G',1, 'D',2, 'R',3, 'P',4, 'O',5, 'S',6, 'N',7) qual
                                 FROM t1 
                                          WHERE t1.c_acte=t3.c_acte 
                                          AND t1.niv=t3.niv 
                                          AND t1.qualite IN ('G', 'D', 'R', 'P', 'O', 'S', 'N') ORDER BY qual) 
                   t2 WHERE rownum<2 )
            else t3.nation end 
FROM t3
Boukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 08h31   #2
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
La message dit que la colonne niv n'existe pas dans la table ou vu t3; Pouvez-vous vérifier ?
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 10h12   #3
Invité de passage
 
Homme
Administrateur de base de données
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Il existe bien évidement, les deux bases sont des copies identiques, l'une est une base de développement sur laquelle la requête a été écrite, et la deuxième c'est la base de production sur laquelle la requête ne s’exécute pas, et je n'arrive pas a comprendre pour quelle raison, on croirai qu'il ne s'agit pas du même interpréteur.
Boukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 11h12   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Lisez "Is there some sort of nesting limit for correlated subqueries"
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/04/2011, 12h03   #5
Invité de passage
 
Homme
Administrateur de base de données
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Ok merci, je vais plutôt le faire en PLSQL c'est plus simple.
Boukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 13h43   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
En pl/sql c'est une mauvaise idée, il faut écrire la requête autrement, par exemple je propose ça mais qui n'est peut être pas tout à fait bon :

Code :
1
2
3
4
5
6
7
8
9
SELECT case when t3.nation = '001' then t2.nation else t3.nation end
  FROM t3
  JOIN (SELECT t1.nation,decode(t1.qualite,'G',1, 'D',2, 'R',3, 'P',4, 'O',5, 'S',6, 'N',7) qual,
               row_number() over (partition BY t1.c_acte, t1.niv ORDER BY decode(t1.qualite,'G',1, 'D',2, 'R',3, 'P',4, 'O',5, 'S',6, 'N',7)) AS rn
          FROM t1
         WHERE t1.qualite IN ('G', 'D', 'R', 'P', 'O', 'S', 'N')
		) t2
	ON t2.c_acte=t3.c_acte AND t2.niv=t3.niv
 WHERE t2.rn = 1
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/04/2011, 15h02   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par Boukha Voir le message
Ok merci, je vais plutôt le faire en PLSQL c'est plus simple.
FBI (Fausse Bonne Idée)
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/04/2011, 17h13   #8
Invité de passage
 
Homme
Administrateur de base de données
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Merci, je vais m'inspirer de ta requête qui m'a l'air bien skuatamad.
Pourquoi pas le PLS?
Boukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 21h12   #9
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Envoyé par Boukha Voir le message
Pourquoi pas le PLS?
Parce que tu vas boucler sur T3 pour interroger T1, donc il y aura une requête exécutée sur T1 pour chaque t3.nation='001'.
Tout dépend du nombre de lignes vérifiant t3.nation='001' aujourd'hui et dans l'avenir mais généralement faire une requête dans une boucle en PL/SQL est contre performant et rapidement intunable.
Donc il ne faut l'utiliser que dans les cas où on ne peut pas faire autrement et clairement ton besoin s'écrit en 1 seule requête SQL sans problème.

Mais pour une analyse moins théorique et plus adaptée au cas présent, il nous faudrait le nombre de lignes de T3, de T1 et le nombre de lignes quand t3.nation='001'.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/04/2011, 01h23   #10
Invité de passage
 
Homme
Administrateur de base de données
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Je ne comptai pas exécuter n fois la requête, je pensai plutôt tout simplement à faire un select (sans rownum) puis traiter les résultat pour déterminer la nationalité en fonction des données associée dans T2
Boukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 15h18   #11
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Ah ok, mais il faudra filtrer en PL/SQL puisque la jointure entre T3 et T1 ramènera trop de lignes, je ne pense pas que ce soit vraiment mieux que faire une jointure dans le code.
Ma proposition à base de row_number n'est pas adaptable à ton besoin ?
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2011, 00h45   #12
Invité de passage
 
Homme
Administrateur de base de données
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Si si, je demandais juste pour comprendre pourquoi c’était pas bien le PLS, sinon ben j'ai utilisé ta requête que j'ai un peu modifié ça a l'air de marcher niquel, merci encore.
Boukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h54.


 
 
 
 
Partenaires

Hébergement Web