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 :

Jointure avec valeur unique


Sujet :

Développement SQL Server

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Jointure avec valeur unique
    Bonjour

    Je suis confronté à un problème que je n'arrive pas à résoudre.
    J'ai une table de Client et une table de Commande. Le numéro du Client se retrouve dans la table commande.

    Je voudrais faire une jointure qui me remonte mes Clients et le numéro de leur première commande uniquement, aps les autres.

    J'y arraive pas. Vous pouvez m'aider, s'il vous plait.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 141
    Points : 176
    Points
    176
    Par défaut
    Je ne dis pas que c'est la meilleure façon de faire mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Client.Numero, (SELECT TOP 1 Commande.Numero
                                      FROM Commande
                                      WHERE Commande.Numero = Client.Numero)
    FROM Client
    Je fais vraiment cela au pif et pas sûr que cela fonctionne

    Il serait peut être bien d'effectuer un ORDER BY dans le SELECT imbriqué

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide.

    J'ai essayé cette méthode et elle marche dans l'absolu.

    Sauf que, dans mon cas, je dois faire ce genre de sélection sur différentes tables, parfois, la même selon différents critères, mais surtout sur un certain volume de donnée. Du coup, j'ai un problème de perf notable et seule la jointure clairement exprimée me donne une retrour dans des délais satisfaisant.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    peux-tu nous fournir une requête, si moche soit-elle, qui indique clairement ce que tu veux ?
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Ben j'ai tenté d'appliquer l'esprit de la proposition de Fabrice et je suis arrivé à cela :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    SELECT
    CONVERT(Varchar(10),DateEstim,103)AS dateestim, 
    LEFT(ISNULL(AG.Libelle_agence,''),3) AS refagence,
    LEFT(ISNULL(LTB.Libelle,''),1) AS Type,
    '<nobr>' + REPLACE(LEFT(
    	CONVERT(VARCHAR(15),CAST(BI.PrixEstime AS MONEY),1),
    	LEN(CONVERT(VARCHAR(15),CAST(BI.PrixEstime AS MONEY),1))-3)
    	,',',' ') + ' &euro;</nobr>' AS prixEstim,
    ISNULL(LOB.Libelle,'') AS originebien, 
    ISNULL(Neg.Prenom + ' ' + Neg.Nom,'') AS Id_Nego,
    ISNULL(CIV.Libelle,'') + ' ' + ISNULL(CLI.Nom,'') + ' ' + ISNULL(CLI.Prenom,'') + '/' +
    	ISNULL(CLI.Telephone,'') + '/' + ISNULL(CLI.portable,'') as refproprio, 
    adressebien AS adressebien, 
    CO.Ville + ' ' + CO.Quartier AS quartier,
    nbpiece AS nbpiece, 
    NoteConfident as noteconfident,
    BI.id_bien AS id_bien, 
    BI.flag_bien AS flag_bien, 
    BI.etat_bien AS etat_bien, 
    BI.Prixestime as PrixFAIfiltre,
    ISNULL(LTT.Libelle,'') AS transac,
    BI.PrixEstime as PrixEstimTri,
    typemandat AS TypeMandat, 
    ISNULL(CIV.Libelle,'') + ' ' + ISNULL(CLI.Nom,'') + ' ' + ISNULL(CLI.Prenom,'') + '/' +
    	ISNULL(CLI.Telephone,'') + '/' + ISNULL(CLI.portable,'') as CliTel,
    ISNULL(CLI.Nom,'') + ' ' + ISNULL(CLI.Prenom,'') as CliRech,
    DateEstim as DEstimTri,
    datemodification AS datemodif, 
    CO.Ville AS VilleBien,
    BI.Quartier AS QuartierRech
     
    FROM Biens BI
    LEFT JOIN LISTE LOB ON LOB.Valeur = BI.OrigineBien and LOB.Nom_liste = 'Origine Bien'
    LEFT JOIN LISTE LTB ON LTB.Valeur = BI.Typebien and LTB.nom_liste = 'Type Bien'
    LEFT JOIN LISTE LTT ON LTT.Valeur = BI.transac and LTT.nom_liste = 'Type Transaction'
    LEFT JOIN (SELECT Id_Bien, MIN(Id_Client) AS Id_Client, Type_Client FROM Client_Bien WHERE Type_Client = 1 
    	GROUP BY Id_Bien, Type_Client) CB ON CB.Id_Bien = BI.Id_Bien
    LEFT JOIN CLIENTS CLI ON CLI.Id_CLient = CB.Id_client
    LEFT JOIN LISTE CIV ON CIV.Valeur = CLI.Civilite AND CIV.Nom_Liste = 'Civilite'
    LEFT JOIN Communes CO ON CO.Id_Commune = BI.quartier
    LEFT JOIN Agence AG ON AG.Id_Agence = BI.Refagence
    LEFT JOIN ADMIN Neg ON Neg.Id_Admin = BI.Id_Nego
    WHERE (flag_bien = 2)
    Les perfs ont l'air pas trop mauvaises, la présence de LEFT JOIN est voulue et maitrisée.

    C'est sur l'alias CB que porte ma demande, sachant que j'ai d'autre cas similaire comme celui là.

    Dans le cas présent on est sur le domain immobilier. L'idée est de faire la listing des biens d'un potefeuille et de rammener un des propriétaires (lorsqu'il y en a plusieurs)
    J'ai pris le parti ici, de prendre celui qui a l'ID le plus petit, partant du principe qu'il a été créé avant les autres et donc qu'il est le principal.

    Mais le principe reste le même partout : je voudrais récupérer une valeur et une seule lorsque la jointure offre plusieurs possibilité, le choix de cette valeur étant pas trés important, la première qui vient est la bonne.
    Le tout, bien entendu, en gardant un niveau de perf correct.

    Est ce que cela convient ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    à première vue, rien de choquant, mais je l'ai regardée superficiellement. Dans ce cas, les performances seront très dépendantes des index. Peux-tu faire ceci devant ta requête, et poster le résultat :
    je pars du principe que tu es sur SQL Server 2005 ou 2008.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  7. #7
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Perdu !

    Je suis sur SQL 2000.

    heu, merci pour le moquerie, mais j'en ai eu marre de me bastonner avec ma hierarchie pour les faire évoluer. Donc on reste sur SQL 2000, on fait de l'ASP 3.0 pour les sites et moi je me casse voir ailleurs s'il y a des gens plus évoluer dans mon coin.
    Bref, tout ça pour dire que je suis dans la mouise à cause de mauvaises volonté patronnales.

    Maintenant, si tu ne vois rien de choquant dans ma rédaction, ben je vais faire avec. Pour les index, faut que j'en repasse une couche, mais je crois que je suis déjà pas mal au point.
    C'est la table Biens qui est la plus grosse et la plus attaquée, du coup, je lui ai collé un paquet d'index, sur les champs les plus utilisés.

    En tout cas merci pour ton aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

Discussions similaires

  1. Liste dynamique avec valeur unique de selected
    Par livininchina dans le forum Langage
    Réponses: 2
    Dernier message: 31/08/2012, 15h43
  2. VBA: Erreur d'affichage listbox avec valeur unique
    Par polenade dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/07/2012, 19h34
  3. [XSD] attribut même nom avec valeur unique
    Par tiger360 dans le forum Valider
    Réponses: 4
    Dernier message: 08/01/2012, 22h32
  4. [AC-2000] Pb de jointure avec valeur null
    Par popysan dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 07/04/2011, 14h37
  5. Enum avec valeur unique
    Par Oberown dans le forum Général Dotnet
    Réponses: 14
    Dernier message: 10/01/2008, 15h52

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