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 :

Requête SQL avec jointure sur la même table


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut Requête SQL avec jointure sur la même table
    Bonjour tout le monde, voici une requête que j'ai créée avec Oracle XE 10, et qui marche parfaitement. Le problème lorsque je lance dans le serveur Oracle 8i elle exécute sans résultat sur des heures. Est-ce possible de la convertir pour qu'elle marche sur ce dernier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t.Ident , Sum(t.DEBIT) AS DEBIT, Sum(t.CREDIT) AS CREDIT, Sum(t.CREDIT) - Sum(t.DEBIT) AS DIFFER,
    t.perd
    from Ecr t
    where t.Ident IN ( Select b.Ident From Ecr B where b.journee='20160128' AND b.Can='12'
    and b.perd = t.perd)
    group by t.Ident, t.perd, t.nat
    HAVING (((t.NAT)<>'K10' And (t.NAT)<>'K11' And (t.NAT)<'K12'))
    order by t.Ident, t.per
    Merci pour votre Aide.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    La clause HAVING est destinée aux restrictions sur des fonctions de regroupement.
    La condition (((t.NAT)<>'K10' And (t.NAT)<>'K11' And (t.NAT)<'K12')) doit donc être posée dans la clause WHERE.
    Avec l'opérateur AND, les parenthèses sont superflues, de même qu'autour des noms de colonnes.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut
    Es pour ça que cette requête ne marche pas sous PL/SQL avec Oracle 8i?

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    D'après ce que vous dite la requête fonctionne (pas d'erreur) sauf qu'elle prends trop de temps pour ramener des résultats. Il est possible que ce qui vous a été suggère aide mais avec seulement ces informations on est plus dans suppositions que dans les certitudes!
    Quand une requête rame commencez par analyser son plan d'exécution. Deuxième point important pour une requête pour Oracle 8 concerne le paramètre qui gère le mode de fonctionnement de l'optimiseur: RULE, CHOOSE ou ALL_ROWS/FIRST_ROW.

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut
    La requête tourne pendant 02 minutes sans résultat. es à cause de l’opérateur (IN) si c'est le problème de l'opérateur, je voudrais s'avoir comment l'utiliser sous oracle 8i.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Je ne pense pas qu'il y ait de restriction à utiliser un "exists" plutôt que where .. in avec oracle 8i
    vous pouvez le tester, ce sera plus performant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [. . .]
    from Ecr t
    where exists
         (Select 1 
          From Ecr B 
          where B.ident = T.ident
            and b.journee='20160128' 
            and b.Can='12'
            and b.perd = t.perd)

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    Peut-être qu'avec les bons index et des statistiques à jour, la requête sera plus performante...

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut
    je ne pense pas que EXISTS marche sous oracle 8 mais je testerais demain au travail pour s'avoir merci.

  9. #9
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Exists marche il n'y a pas de doute. A l'époque l'optimiseur était moins intelligent qu'aujourd'hui et il est possible que le changement de syntaxe paye.
    Mais la question qui demeure reste: c'est quoi le problème, le fait que la requête prends 2 minutes ou qu'elle ne ramène rien?

  10. #10
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut
    Je vais vous expliqué se que je cherche comme requête avec cette image ma tables écriture_comptable, SGBD Oracle 8i
    Nom : Sans titre.png
Affichages : 591
Taille : 40,3 Ko
    l'affichage que vous voyez et un exemple d'un employeur. Alors ma requête consiste à faire la somme du débit et du crédit de chaque employeur avec sa période sur le critère de la journée exemple la journée du 28/01/2016 sachant que les écriture porter sur le champ débit pourrait être différent de la journée du critère voulu.

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut
    Personne pour m'aider sur cette requête.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mars 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 82
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par chemirikmohamed Voir le message
    Je vais vous expliqué se que je cherche comme requête avec cette image ma tables écriture_comptable, SGBD Oracle 8i
    Nom : Sans titre.png
Affichages : 591
Taille : 40,3 Ko
    l'affichage que vous voyez et un exemple d'un employeur. Alors ma requête consiste à faire la somme du débit et du crédit de chaque employeur avec sa période sur le critère de la journée exemple la journée du 28/01/2016 sachant que les écriture porter sur le champ débit pourrait être différent de la journée du critère voulu.
    Pour faire un sous-total , je pense que la clause Over (partition by ...) devrait t'aider.

    J'ai posté un message il y a pas longtemps sur ça.

  13. #13
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut
    Salut Tous le monde,
    es possible d'avoir un exemple de requête de ce que j'ai exposer comme problème
    Nom : Sans titre.png
Affichages : 601
Taille : 41,4 Ko
    je cherche la somme du débit et du crédit sachant que chaque ligne du débit encerclé en rouge ce s’additionne à celle du crédit.

  14. #14
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut
    Salut tous le monde, je viens de réalisé cette requête SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t.NumeroCot || Cle(t.NumeroCot) Num_Emp, t.Periode--, t.nature
           ,Sum(t.Debit) Debit, Sum(t.Credit) Credit
      FROM Linc.Secu_Ecr t,
           (SELECT Numerocot, Periode, Nature, Canal, Ecriture, Journee
              FROM Linc.Secu_Ecr WHERE Journee = '20160223' AND Canal = '12' ) b
     WHERE t.NumeroCot = b.NumeroCot
     AND t.Periode = b.Periode AND Substr(t.journee,1,4) = Substr(b.journee,1,4)
     AND t.Nature  = b.Nature AND t.Ecriture <> 'TC' AND t.Ecriture <> 'MC'
     Group By t.NumeroCot, t.periode--, t.nature
     Order by t.NumeroCot
    avec cette requête j'arrive à un meilleur résultat. es une idée meilleur.

Discussions similaires

  1. [MySQL] SELECT * avec jointure sur une même table
    Par Oprichnik dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/03/2011, 13h17
  2. Requete avec jointure sur la même table
    Par CaptainChoc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/04/2009, 12h30
  3. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 20h24
  4. [MySQL] requête avec jointure sur la même table
    Par gwena54 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/05/2007, 11h22
  5. [SQL] Requête complexe avec appel multiple à la même table
    Par Julien Dufour dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/04/2005, 14h12

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