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 :

Limiter le nombre de correspondance dans une jointure externe ?


Sujet :

Développement SQL Server

  1. #1
    Membre émérite Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Par défaut Limiter le nombre de correspondance dans une jointure externe ?
    Bonjour,
    ce que j'ai besoin de faire est un peu tordu, je vous passe les détails du pourquoi, c'est comme ça et il faut absolument que j'y arrive, et il faut que j'y arrive en SQL uniquement (pas le droit de traiter les résultats après dans le programme client).

    Disons que j'ai deux tables A et B, avec une clé étrangère de B vers A, plusieurs enregistrements de B peuvent correspondre à un enregistrement de A (0, n) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A (ida, champa1, champa2, champa3)
    B (ida#, champb1)
    Je voudrais sélectionner tous les champs de A (tous les enregistrements), en y ajoutant la première occurence de B trouvée (NULL si aucune correspondance)
    Au final, je dois avoir un résultat ayant les champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ida, champa1, champa2, champa3, champb1
    Et ce résultat doit retourner EXACTEMENT le même nombre de ligne que dans la table A.
    Il ne faut pas exclure les enregistrements de A n'ayant pas de correspondance dans B (donc j'imagine que c'est une jointure externe ?), et il ne faut avoir que la 1ere occurrence (dans l'ordre de la sélection) de champb1, tant pis s'il y a d'autres correspondances, elles doivent passer à la trappe (et ça je n'ai pas encore trouvé comment faire).

    Oui, je sais, c'est tordu ...

    Pour l'instant je fais ceci comme requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A.ida, A.champa1, A.champa2, Achampa3, B.champb1
    FROM A
    LEFT OUTER JOIN B ON A.ida = B.ida
    C'est presque bon, sauf que si un enregistrement de A à plusieurs correspondances dans B, j'obtiensw plusieurs lignes dans le résultat (normal).
    Ce qu'il me faudrait (si ça existait), ça serait quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A.ida, A.champa1, A.champa2, Achampa3, B.champb1
    FROM A
    LEFT OUTER JOIN B ON A.ida = B.ida LIMIT 1
    Comment obtenir quelque chose d'équivalent sans traiter le résultat a posteriori ?

    Merci beaucoup à celui ou celle qui pourra me sauver sur ce coup-là !

    (PS : c'est sous SQL Server 2005)

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Il ne faut pas exclure les enregistrements de A n'ayant pas de correspondance dans B (donc j'imagine que c'est une jointure externe ?)
    C'est exact et votre code plus bas correspond à cette affirmation.

    et il ne faut avoir que la 1ere occurrence (dans l'ordre de la sélection) de champb1
    Comment déterminez-vous cet ordre ? Il n'y a pas de clause ORDER BY dans votre requête

    LIMIT n'est pas SQL car il n'est pas ensembliste

    @++

  3. #3
    Membre émérite Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Par défaut
    Comment déterminez-vous cet ordre ? Il n'y a pas de clause ORDER BY dans votre requête
    Aucune importance, la première ligne venue fera l'affaire ... oui, je sais, c'est bizzare, mais faut pas chercher à comprendre : c'est comme ça (il y a bien une justificattion découlant du type de données que j'extrait et de la nature de la demande à la quelle je dois répondre mais je ne vais pas m'étendre dessus, ni sur son bien-fondé).

    LIMIT n'est pas SQL car il n'est pas ensembliste
    Oui, je sais que ce n'est pas valable (sinon j'aurais la solution et je n'aurais pas besoin d'aide), c'était juste pour illustrer ce que j'ai besoin de faire.

    Comment arriver au même résultat par un autre moyen ?

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Vous pouvez par exemple utiliser la fonction de fenêtrage ROW_NUMBER() :

    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
    ;WITH
    	CTE AS
    	(
    		SELECT		A.ida
    				, A.champa1
    				, A.champa2
    				, A.champa3
    				, B.champb1
    				, ROW_NUMBER() OVER(PARTITION BY A.ida ORDER BY B.champb1) AS n
    		FROM		dbo.A AS A
    		LEFT JOIN	dbo.B AS B ON A.ida = B.ida
    	)
    SELECT	ida
    	, champa1
    	, champa2
    	, champa3
    	, champb1
    FROM	CTE
    WHERE	n = 1
    @++

  5. #5
    Membre émérite Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Par défaut
    Super, ça marche au poil !

    Merci mille fois !!! Je pense que je n'aurais pas trouvé tout seul, ou alors j'aurais galéré pendant des lustres.

    Comme dirait l'autre : ça m'enlève une fière chandelle du pied

    Encore merci !

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Avec plaisir

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/08/2006, 13h36
  2. limite du nombre de caractères dans une requete
    Par pheno82 dans le forum Access
    Réponses: 3
    Dernier message: 01/06/2006, 23h12
  3. limiter le nombre d'enregistrements d'une jointure
    Par dubem1 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/12/2005, 09h29
  4. [C#] Limité le nombre de lignes dans une DataView ...
    Par maitrebn dans le forum Accès aux données
    Réponses: 5
    Dernier message: 08/11/2005, 00h57
  5. limitation du nombre d'enregistrement sur une jointure
    Par coredump dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/06/2005, 17h13

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