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

Oracle Discussion :

Ne choisir QUE les lignes qui ont ce critere


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2004
    Messages : 14
    Par défaut Ne choisir QUE les lignes qui ont ce critere
    Bonjour
    Alors voila pour resumé mon problème, j'ai 2 tables.

    Une table A avec la clé primaire id_A
    et une table B qui contient un champs champ_B et id_A

    Les tables A et B sont en liaison (1,n) pour une ligne de A, plusieurs lignes de B

    Alors ce que je veux faire c'est de choisir les lignes de la table A qui n'ont QUE champ_B=12 par exemple.
    Quelqu'un aurait il une idée de la facon de mettre cela en place?

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Avec une clause exists par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select *
    from tableA a
    where exists (select null 
                  from tableB b 
                  where b.idA=a.idA 
                    and champB=12);

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 286
    Par défaut
    Je me demande si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select a.*
    from tableA a,tableB b
    where b.idA=a.idA 
                    and b.champB=12);
    ne serait pas un peu plus 'optimum'

  4. #4
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Certes si on considère qu'il n'existe qu'une seule ligne dans B pour laquelle champ_B=12, sinon ça duplique A et il faut mettre un distinct, et ça coûte plus cher.

  5. #5
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par Alain B.
    Je me demande si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select a.*
    from tableA a,tableB b
    where b.idA=a.idA 
                    and b.champB=12);
    ne serait pas un peu plus 'optimum'
    Pas forcément. Il faut pour cela étudier le plan d'exécution. Il n'y a pas de règles toute faite. Mais de manière générale, la clause exists est plus performante.

  6. #6
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2004
    Messages : 14
    Par défaut
    Bonjour,
    Merci pour vos réponses, mais je pense que mon exemple avec mes tables A et B ne correspondait pas vraiment avec ce que je souhaitait reelement faire.
    Après quelques bon retournement du cervelet gauche j'ai réussi à troouver une soultion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SELECT * FROM ENTETE_OP WHERE NUM_OP IN ( 
                      SELECT DISTINCT NUM_OP FROM LIGNE_COLISEE 
                      WHERE NUM_OP IN (
                                 SELECT NUM_OP FROM LIGNE_COLISEE  
                                 WHERE (ID_PRODUIT=039353 OR ID_PRODUIT=636673                     
                                       OR ID_PRODUIT=636700 OR ID_PRODUIT=637464)
                                       AND ID_SOCIETE='PF'
                      MINUS
                                 SELECT  NUM_OP FROM LIGNE_COLISEE  
                                 WHERE ID_PRODUIT<>039353 AND ID_PRODUIT<>636673 
                                     AND ID_PRODUIT<>636700 AND ID_PRODUIT<>637464
                                     AND ID_SOCIETE='PF'
                      )
    )
    Bon voila je pense que vous vous en doutez, cette requete n'est pas du tout optimiser, j'obtiens un TABLE ACCESS FULL sur chaque requete utilisé pour l'operation MINUS.
    Pour info NUM_OP est la clé de la table ENTETE_OP, et est aussi un index dans la table LIGNE_COLISEE
    Si quelqu'un a une idée de la manière à proceder pour optimiser cette requete, qu'il le dise ou qu'il se taise à jamais !!!!

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    1 minus fait déjà un distinct
    1 IN (select ) : pas besoin de distinct

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT *
    FROM ENTETE_OP 
    WHERE NUM_OP IN (
    		SELECT NUM_OP 
    		FROM LIGNE_COLISEE a
    		WHERE (id_produit=039353 OR id_produit=636673 OR id_produit=636700 OR id_produit=637464)
    		AND id_societe='PF'
    		AND NOT EXISTS ( SELECT  1 
    				FROM LIGNE_COLISEE  
    				WHERE num_op  = a.num_op 
    				AND id_produit <> 039353 AND id_produit <> 636673 
    				AND id_produit <> 636700 AND id_produit <> 637464
    				AND id_societe='PF'
    				)
    		)
    et enfin avec des EXISTS et NOT EXISTS (tout dépend des index et de la taille de ta table principale)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT *
    FROM ENTETE_OP a 
    WHERE EXISTS (	SELECT 1
    		FROM LIGNE_COLISEE
    		WHERE (id_produit=039353 OR id_produit=636673 OR id_produit=636700 OR id_produit=637464)
    		AND id_societe='PF'
    		AND num_op = a.num_op
    		)
    AND NOT EXISTS ( SELECT  1 
    		FROM LIGNE_COLISEE  
    		WHERE num_op  = a.num_op 
    		AND id_produit <> 039353 AND id_produit <> 636673 
    		AND id_produit <> 636700 AND id_produit <> 637464
    		AND id_societe='PF'
    		)

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/01/2013, 15h41
  2. [XL-2007] Retrouver toutes les lignes qui ont une valeur identique dans la colonne A
    Par bartimeus35 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/06/2012, 17h47
  3. Réponses: 6
    Dernier message: 10/11/2009, 11h58
  4. Réponses: 6
    Dernier message: 26/11/2008, 20h14
  5. Réponses: 5
    Dernier message: 19/01/2007, 22h53

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