Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/05/2011, 09h51   #1
Invité régulier
 
Inscription : octobre 2009
Messages : 26
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 26
Points : 7
Points : 7
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 :
SELECT ID_Object FROM Table2 WHERE  ID_Object = xx AND Code_Langue = yy
sinon
Code :
SELECT ID_Object FROM Table2 WHERE  ID_Object = xx AND Code_Langue = zz
(zz= code langue par défaut)
sinon
Code :
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
fabienazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 10h18   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Vous pouvez faire quelque chose comme ça :

Code SQL :
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 '%'
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 13h31   #3
Invité régulier
 
Inscription : octobre 2009
Messages : 26
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 26
Points : 7
Points : 7
Merci.

Est-il possible d'adapter cette requête pour utiliser contains (à la place de like)?
fabienazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 15h34   #4
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 16h18   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
que donne ceci :
Code SQL :
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 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/05/2011, 16h39   #6
Invité régulier
 
Inscription : octobre 2009
Messages : 26
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 26
Points : 7
Points : 7
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.
fabienazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 16h42   #7
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Malheuresement, c'est beaucoup plus lent que la requête utilisant like
Ce qui n'est pas normal...

Essayez avec des unions...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 20h36   #8
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
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 ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h47.


 
 
 
 
Partenaires

Hébergement Web