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 10/12/2007, 15h03   #1
Membre habitué
 
Inscription : décembre 2004
Messages : 199
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2004
Messages : 199
Points : 140
Points : 140
Par défaut Problème Requete Imbriquée

Bonjour,

J'ai un problème avec des requetes imbriquées. Je n'arrive pas à récupérer un champs dans une sous requete.

La requete est la suivante :

Code :
1
2
3
SELECT DISTINCT utables.column_name, '|', utables.table_name, '|', (SELECT count(*) FROM (SELECT DISTINCT table_name FROM all_tab_columns t WHERE t.table_name = utables.table_name))
 FROM all_tab_columns utables WHERE table_name IN (SELECT table_name FROM all_tables WHERE upper(owner) = upper('TEST')) AND column_name LIKE '%OID' AND data_type LIKE 'NUMBER' AND up
per(owner) = upper('TEST');
L'erreur est la suivante : ORA-00904: "UTABLES"."TABLE_NAME" : identificateur non valide

Lorsque j'enlève le select count(*), il n'y a plus de problème

Code :
1
2
3
SELECT DISTINCT utables.column_name, '|', utables.table_name, '|', (SELECT DISTINCT table_name FROM all_tab_columns t WHERE t.table_name = utables.table_name)
 FROM all_tab_columns utables WHERE table_name IN (SELECT table_name FROM all_tables WHERE upper(owner) = upper('TEST')) AND column_name LIKE '%OID' AND data_type LIKE 'NUMBER' AND up
per(owner) = upper('TEST');
Si quelqu'un à une idée pour transmettre les données à mes sous requetes, je suis preneur
theyankee76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 16h51   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
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 319
Points : 5 837
Points : 5 837
J'ai l'impression que cette requête est équivalente
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT DISTINCT utables.column_name, '|', utables.table_name, '|', 
  (SELECT count(DISTINCT table_name ) 
           FROM all_tab_columns t 
            WHERE t.table_name = utables.table_name)
  FROM all_tab_columns utables 
 WHERE table_name IN (SELECT table_name 
                        FROM all_tables 
                       WHERE upper(owner) = upper('TEST')) 
   AND column_name LIKE '%OID' 
   AND data_type LIKE 'NUMBER' 
   AND upper(owner) = upper('TEST');
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 17h20   #3
Membre habitué
 
Inscription : décembre 2004
Messages : 199
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2004
Messages : 199
Points : 140
Points : 140
Non, ce n'est pas la même requête. Ma requête doit retourner le nombre d'enregistrement dans chacune des tables.
theyankee76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 18h38   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 217
Points : 4 217
Fallait commencer par là.
Ce que tu as fais est faux et n'est pas possible.

Code :
1
2
3
SELECT DISTINCT table_name 
FROM all_tab_columns t 
WHERE t.table_name = utables.table_name
Renvoit toujours 1 seule ligne (= utables.table_name)

Donc en admettant que utable.table_name soit visible du niveau 3 (ce qui n'est pas le cas)
Code :
1
2
3
4
(SELECT COUNT(*) 
FROM 
(SELECT DISTINCT table_name FROM all_tab_columns t WHERE t.table_name = utables.table_name)
)
Renverra toujours 1
C'est equivalent à
Code :
1
2
3
4
(SELECT COUNT(*) 
FROM 
(SELECT 1 FROM DUAL)
)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 18h41   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 217
Points : 4 217
Ah oui, pour le nb de lignes de chaque table, faut passer par de l'execute immediate (Une petite recherche sur le forum : la question à été posée x fois)

Tu peux aussi utiliser le nb_rows de all_tables, si les stats viennent d'être calculées et que tu veux pas un chiffre sur à 100% au moment du select.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h55.


 
 
 
 
Partenaires

Hébergement Web