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

Développement SQL Server Discussion :

Test d’existence sur toute la table


Sujet :

Développement SQL Server

  1. #1
    Membre régulier Avatar de Morad ISSOULGHANE
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2009
    Messages : 98
    Points : 94
    Points
    94
    Par défaut Test d’existence sur toute la table
    Bonjour,

    J'ai une table produit (ref_prd, ref_car, attribut) et une autre table tmp (ref_car, attribut). Et je voudrais que ma raquête SQL me retourne l'ensemble de ref_prd qui correspondent à la condition suivante :

    quelque soit le couple (tmp.ref_car, tmp.attribut), alors ce couple est présent dans la table produit.

    Exemple :

    produit
    ref_prd ref_car attribut
    prd1 A 1
    prd1 B 1
    prd2 A 1
    prd2 B 2
    prd3 C 5
    prd3 A 1

    tmp
    ref_car attribut
    A 1
    B 1


    Dans ce cas de figure je dois retourner prd1, parce que pour ces lignes, les champs ref_car et attribut correspondent exactement au contenu de ma table tmp.

    J'ai commencé par mettre en place un fonction SQL (qui pour chaque produit test l'existance de toutes ses propriété sur la table dans une boucle loop), mais le temps de réponse n'est pas génial.

    Merci pour votre aide.

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Tu devrais pouvoir faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT
      P.ref_prd
    FROM tmp T
    LEFT JOIN produit P
      ON (T.ref_car = P.ref_car)
    GROUP BY P.ref_prd
    HAVING 
      AVG(
        CASE WHEN T.attribut = P.attribut
        THEN 1 ELSE -9999
        END
      ) = 1
    L'idée :
    - si un attribut est présent avec la bonne valeur, alors le CASE retourne 1
    - si un attribut est manquant (LEFT JOIN -> NULL) ou n'a pas la valeur attendue, alors le CASE retourne une valeur différente de 1
    - on s'attend à ce que dans tous les cas, CASE retourne 1 et donc que la moyenne (AVG) soit égale à 1. Si au moins une valeur différe ou est manquante, la moyenne est faussée (différente de 1)
    - le HAVING sert à déterminer si la moyenne est faussée ou non
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Membre régulier Avatar de Morad ISSOULGHANE
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2009
    Messages : 98
    Points : 94
    Points
    94
    Par défaut
    Bonjour,

    L'idée est ingénieuse, mais je pense que il reste un cas de figure qu'elle gère pas.

    Exemple :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    CREATE TABLE TMP 
    (
    ref_car VARCHAR(5),
    attribut VARCHAR(5)
    )
    CREATE TABLE PRODUIT 
    (
    ref_prd VARCHAR(5),
    ref_car VARCHAR(5),
    attribut VARCHAR(5)
    )
     
    INSERT INTO PRODUIT VALUES ('1','A','1')
    INSERT INTO PRODUIT VALUES ('1','B','3')
    INSERT INTO PRODUIT VALUES ('1','C','1')
     
    INSERT INTO PRODUIT VALUES ('2','A','1')
    INSERT INTO PRODUIT VALUES ('2','B','3')
     
    INSERT INTO PRODUIT VALUES ('3','C','1')
    INSERT INTO PRODUIT VALUES ('3','E','1')
     
    INSERT INTO TMP VALUES ('A','1')
    INSERT INTO TMP VALUES ('B','3')
    Normalement la requete doit retourner ref_prd = 2 alors qu'elle retourne 1 et 2.

    Merci

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 779
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 779
    Points : 52 763
    Points
    52 763
    Billets dans le blog
    5
    Par défaut
    Il s'agit d'une division relationnelle. Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/divrelationnelle/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre régulier Avatar de Morad ISSOULGHANE
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2009
    Messages : 98
    Points : 94
    Points
    94
    Par défaut
    Bonjour SQLpro,

    C'est exactement ce que je recherche. Je marque comme résolu.

    Merci à tous.

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Morad ISSOULGHANE Voir le message
    L'idée est ingénieuse, mais je pense que il reste un cas de figure qu'elle gère pas.
    Ah non, je ne suis pas d'accord !

    Ça fait exactement ce que vous avez demandé (ou alors c'est que vous avez mal exprimé votre besoin).

    En effet, vous dites :
    Citation Envoyé par Morad ISSOULGHANE Voir le message
    quelque soit le couple (tmp.ref_car, tmp.attribut), alors ce couple est présent dans la table produit.
    Cependant, à aucun moment vous n'avez dit que si une valeur est présente dans produit mais pas dans tmp, alors la condition n'est pas remplie.

    Heureusement, c'est possible : comme précédemment (AVG()), mais en utilisant un FULL JOIN.

    Par contre, avec le FULL JOIN, il faut faire attention à la manière dont on filtre les tables (par exemple si on décide de filtrer la table tmp : il faut filtrer avant que le FULL JOIN ne prenne effet).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. recherche sur toutes les tables
    Par galinette dans le forum Access
    Réponses: 1
    Dernier message: 29/06/2007, 11h16
  2. Réponses: 3
    Dernier message: 14/03/2007, 17h31
  3. Grant sur toutes les tables en même temps
    Par jer64 dans le forum SQL
    Réponses: 3
    Dernier message: 25/09/2006, 07h59
  4. Réponses: 4
    Dernier message: 06/09/2006, 14h04
  5. [Debutant] faire un update sur tout une table
    Par Karibou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 14h44

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