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 :

Union ou join ou ?


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 23
    Points
    23
    Par défaut Union ou join ou ?
    Bonjour,

    1. J'aimerai effectuer une requête pour obtenir le nom d'une entité.
    La requête devrait me permettre d'obtenir le nom de l'entité dans la langue voulue ou le nom de l'entité dans la langue par défaut ou le nom 'interne' de l'entité.
    J'ai 2 tables
    Table1: ID_Object Nom_Interne
    Table2: ID_Object Code_Langue Nom

    Pour l'instant je fais cela en 3 requêtes max.

    Si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select ID_Object from Table2 where  ID_Object = xx AND Code_Langue = yy
    sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select ID_Object from Table2 where  ID_Object = xx AND Code_Langue = zz
    (zz= code langue par défaut)
    sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select ID_Object from Table1 where  ID_Object = xx

    2. J'aimerai effectuer une recherche par nom (avec like) avec les mêmes tables dans une langue donnée avec les mêmes règles càd n'obtenir qu'une fois chaque entité qui doit avoir le bon nom dans la langue donnée ou dans la langue par défaut ou le bon nom 'interne'.

    Merci d'avance pour votre aide

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Vous pouvez faire quelque chose comme ça :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT COALESCE(Nom.Nom, Defaut.Nom, T.Nom_Interne) AS Nom
    FROM Table1 T
    LEFT OUTER JOIN Table2 Nom
        ON Nom.ID_Object = T.ID_Object
        AND Nom.Code_Langue = yy
    LEFT OUTER JOIN Table2 Defaut
        ON Nom.ID_Object = T.ID_Object
        AND Nom.Code_Langue = zz
    WHERE COALESCE(Nom.Nom, Defaut.Nom, T.Nom_Interne)  LIKE '%'

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 23
    Points
    23
    Par défaut
    Merci.

    Est-il possible d'adapter cette requête pour utiliser contains (à la place de like)?

  4. #4
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Est-il possible d'adapter cette requête pour utiliser contains (à la place de like)?
    Peut-être pouvez vous chercher un peu?


    Comme çà je dirais non... pour çà le FULLTEXT est contraignant mais cela est possible en passant par des unions par exemple...

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    que donne ceci :
    Code SQL : 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
     
    SELECT COALESCE(Nom.Nom, Defaut.Nom, T.Nom_Interne) AS Nom
    FROM Table1 T
    LEFT OUTER JOIN Table2 Nom
        ON Nom.ID_Object = T.ID_Object
        AND Nom.Code_Langue = yy
    LEFT OUTER JOIN Table2 Defaut
        ON Nom.ID_Object = T.ID_Object
        AND Nom.Code_Langue = zz
    WHERE 
        CONTAINS(Nom.Nom, 'xxx')
        OR (
            Nom.Nom IS NULL
            AND CONTAINS(Defaut.Nom, 'xxx')
        )
        OR (
            COALESCE(Nom.Nom, Defaut.Nom) IS NULL
            AND CONTAINS (T.Nom_Interne, 'xxx')
        )

    Vous pouvez aussi ajouter la clause CONTAINS dans les conditions de jointure.

    bref, il y a des solutions, mais cela dépend aussi de ce que vou svoulez exactement. Voulez vous faire la recherche uniquement sur le nom qui "ressort", ou sur n'importe quel nom :
    Si par exemple, un produit n'a pas de nom dans la langue mais un nom par défaut "filtre" et que le nom_interne est "filtre à huile", voulez vous qu'une recherche sur "huile" le fasse ressortir ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 23
    Points
    23
    Par défaut
    Merci de la réponse.

    Malheuresement, c'est beaucoup plus lent que la requête utilisant like
    contains: CPU time = 1388 ms, elapsed time = 1421 ms.
    like : CPU time = 15 ms, elapsed time = 64 ms.

    • bref, il y a des solutions, mais cela dépend aussi de ce que vou svoulez exactement. Voulez vous faire la recherche uniquement sur le nom qui "ressort", ou sur n'importe quel nom :
    • Si par exemple, un produit n'a pas de nom dans la langue mais un nom par défaut "filtre" et que le nom_interne est "filtre à huile", voulez vous qu'une recherche sur "huile" le fasse ressortir ?

    Non, le produit ne sortirait que pour filtre.

  7. #7
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Malheuresement, c'est beaucoup plus lent que la requête utilisant like
    Ce qui n'est pas normal...

    Essayez avec des unions...

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Je ne vois pas l'intérêt d'utiliser le FULLTEXT ici.
    A moins que la colonne nom soit vraiment une description à part entière ?

    ++

Discussions similaires

  1. Requete union et join
    Par vincnet68 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/07/2011, 00h03
  2. Requêtes (Join/Union) Report Studio
    Par Lust14 dans le forum Cognos
    Réponses: 11
    Dernier message: 10/09/2010, 15h55
  3. Aide JOIN ou UNION…
    Par 810mcu dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/06/2008, 13h10
  4. [SQL server] requete sql join/union?
    Par Alex35 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/11/2007, 17h45
  5. Réponses: 3
    Dernier message: 18/12/2006, 10h14

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