IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Sous-requête dans la clause FROM [11g]


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Sous-requête dans la clause FROM
    Bonjour,

    Je rencontre un problème de syntaxe en essayant de mettre une sous-requête dans la clause FROM.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT
    	A.FACTUR,
    	C.DDEST
    FROM
    	BOFAC A,
    	(SELECT BOFACSUI.DDEST FROM BOFACSUI) C
    WHERE
    	( A.FACTUR=C.FACTUR (+)and A.ORGA=C.ORGA(+)  )
    Le message d'erreur est : "ORA-00904: "C"."ORGA" : identificateur non valide"

    Quelqu'un peut-il m'expliquer ? Après de vaines tentatives, je ne vois vraiment pas ce qui cloche...

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Ta sous-requête (SELECT BOFACSUI.DDEST FROM BOFACSUI) retourne une seule colonne nommée DDEST.
    Il est tout à fait normal que l'interpréteur ne trouve pas la colonne C.ORGA

    Par ailleurs, cela fait déjà un certain temps qu'Oracle accepte la syntaxe normalisée pour les jointures... Il serait bon que tu les utlises, ne serait-ce que pour améliorer la lisibilité de ton code.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Mince, merci pour l'explication, c'était tout bête mais j'avais mal compris le fonctionnement

    Je suis maintenant confronté à un deuxième problème, celui-ci me semble beaucoup plus mystérieux

    En fait la requête précédente me renvoie 3 lignes, et j'aimerais qu'elle ne me renvoie que la 2ème ligne.

    Je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    	A.FACTUR,
    	C.DDEST
    FROM
    	BOFAC A,
    	(SELECT ORGA,FACTUR,DDEST,ROWNUM FROM BOFACSUI) C
    WHERE
    	( A.FACTUR=C.FACTUR (+)AND A.ORGA=C.ORGA(+)  )
    	AND  ( ROWNUM = 2 )
    Mais cela ne me renvoie rien.

    Cependant, si je remplace :
    Par :
    Cela me renvoie les 2 premières lignes.

    Par contre, si j'essaie :
    Cela ne me renvoie rien, je devrais pourtant avoir les 2 dernières lignes non ?

    Comment ruser pour n'avoir que la 2ème ligne...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Si tu utilises bien la version 11g, pourquoi te limiter aux fonctions et opérateurs de la 7 ?

    Les jointures s'écrivent avec (INNER|LEFT|RIGHT) JOIN depuis la 8i (1999) !
    Les fonctions analytiques de regroupement aussi !

    Une table n'est pas ordonnée. En conséquence, l'utilisation de ROWNUM dans une requête sans clause ORDER BY donnera un résultat aléatoire.
    De plus, la fonction ROWNUM de la requête principale ne renverra pas obligatoirement les mêmes valeurs que celles de la sous-requête.

    Regarde la fonction ROW_NUMBER() dans ta documentation, elle devrait répondre à tes besoins.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    J'utilisais ROWNUM car il serait apparemment plus efficace que ROW_NUMBER() (http://explainextended.com/2009/05/0...ber-vs-rownum/)

    En fait j'aimerais obtenir ça...

    ID Date RowNumber
    130300555 26/03/13 1
    130300555 04/04/13 2
    130300555 08/04/13 3
    130300568 27/03/13 1
    130300568 05/04/13 2

    Il faudrait que le RowNumber soit reset pour chaque identifiant.

    Je pense que je vais plutôt régler le problème coté code, mes compétences sql étant trop limitées (et je ne peux malheureusement pas m'y attarder si je veux finir mon projet à temps )

    Mais merci pour ton aide, j'y vois déjà plus clair !

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Cette requête te donnera le résultat que tu décris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select  MON_ID
        ,   MA_DATE
        ,   row_number() over (partition by MON_ID order by MA_DATE) as ROWNUMBER
    from    MA_TABLE
    order by MON_ID
        ,   MA_DATE
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup cela fonctionne à merveille. Je découvre les fonctions de fenêtrage.

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/04/2014, 13h35
  2. Besoin d'une sous requête dans la clause ORDER BY
    Par Renand dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/09/2010, 14h41
  3. Sous-select dans la clause FROM
    Par DIJON dans le forum SQL
    Réponses: 16
    Dernier message: 16/11/2007, 18h24
  4. [Requête]Requête dans la clause FROM
    Par ceuce dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 15/05/2007, 09h17
  5. Sous-requête dans la clause Select
    Par Danger dans le forum WinDev
    Réponses: 2
    Dernier message: 24/05/2005, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo