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 :

Obtenir les articles de deux années


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 55
    Par défaut Obtenir les articles de deux années
    Bonjour,

    J'ai une table réception dans laquelle je dois récupérer tous les codes produit qui ont été acheté dans deux année différente.
    Pour ce faire, j'utilise la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM RECEPTION WHERE CODEPRODUIT IN(
    SELECT A.CODEPRODUIT  CODEPRODUIT FROM 
    (SELECT DISTINCT CODEPRODUIT FROM RECEPTION WHERE ANNEE='2008') A,
    (SELECT DISTINCT CODEPRODUIT FROM RECEPTION WHERE ANNEE='2009') B
    WHERE A.CODEPRODUIT=B.CODEPRODUIT) AND ANNEE IN('2008','2009')
    Cependant, le chargement des données est assez long, au point que je ne peux même pas obtenir toutes les données dans un délais convenable.

    Je me suis donc orienté vers l'utilisation d'un INTERSECT mais je ne suis pas sur de moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM RECEPTION WHERE CODEPRODUIT IN(
    (SELECT CODEPRODUIT FROM RECEPTION WHERE ANNEE='2008')
    INTERSECT
    (SELECT CODEPRODUIT FROM RECEPTION WHERE ANNEE='2009'))
    AND ANNEE IN('2008','2009')
    Cette requête est beaucoup plus rapide mais je ne sais pas si je récupère les mêmes données étant donné que je ne peux pas le comparer avec la première.

    Si une personne a une solution pour cette problématique, merci d'avance à celui qui répondra à mon message.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous pouvez utiliser ce bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CODEPRODUIT
    FROM RECEPTION
    WHERE ANNEE IN ('2008', '2009')
    GROUP BY CODEPRODUIT
    HAVING COUNT(*) = 2

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 55
    Par défaut
    Il me faudra forcément une sous requête car je dois récupérer tous les champs de la table réception qui ont le code produit présent en 2008 et en 2009.
    Je me suis peut être mal exprimé dans mon premier message.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est la sous-requête !

  5. #5
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous pouvez utiliser ce bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CODEPRODUIT
    FROM RECEPTION
    WHERE ANNEE IN ('2008', '2009')
    GROUP BY CODEPRODUIT
    HAVING COUNT(*) = 2
    Pour que cette requête fonctionne, il faut que chaque CODEPRODUIT ne figure qu'une seule fois par année dans la table, ce qui n'a pas l'air d'être le cas vu le DISTINCT du tout premier exemple.
    Il faudrait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CODEPRODUIT
    FROM RECEPTION
    WHERE ANNEE IN ('2008', '2009')
    GROUP BY CODEPRODUIT
    HAVING COUNT(DISTINCT ANNEE) = 2
    Sinon, pour moi la requête avec le INTERSECT retourne les bons résultats.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Bien vu pour le distinct dans le count, c'est effectivement obligatoire.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 55
    Par défaut
    Juste pour un retour, il s'est avéré effectivement que mon bout de code avec Intersect est correct.
    Merci tout de même aux deux personnes qui se sont penchées sur mon problème.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/12/2014, 17h15
  2. Obtenir les 5 dernières ventes par article
    Par miniquick dans le forum Développement
    Réponses: 6
    Dernier message: 20/06/2008, 11h36
  3. Donnez votre avis sur les articles de Developpez.com
    Par Geronimo dans le forum C++Builder
    Réponses: 13
    Dernier message: 14/01/2007, 22h00
  4. Donnez votre avis sur les articles de Developpez
    Par Anomaly dans le forum Contribuez
    Réponses: 37
    Dernier message: 29/05/2006, 21h48
  5. Obtenir les taches en cours
    Par mlerat22 dans le forum MFC
    Réponses: 3
    Dernier message: 17/06/2002, 12h36

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