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 :

Requête multi adresses en colonne


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Points : 22
    Points
    22
    Par défaut Requête multi adresses en colonne
    Bonjour à tous,

    Je vais essayer de m'exprimer convenablement....

    J'ai une table qui représente les adresses:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TABLE: ADRESSE
     
    adresse_id        rue              npa       ville
    ------------------------------------------
    1             'des pommes 6'     1234      Paris
    2             'des poires 7'        1234      Paris
    3             'des cerises 1'       1234     Paris
    4             'des bananes 1'     1234     Paris
    une table personne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TABLE: PERSONNE
     
    pers_id           nom
    ----------------------
    1                   Paul
    2                   Pierre
    3                   Jacques
    et une table de jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TABLE: PERS_ADR
     
    pers_id           adresse_id
    ----------------------
    1                   1
    1                   2
    1                   3
    2                   4

    Finalement, j'aimerai obtenir le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Nom      rue1  npa1   ville1   rue2  npa2  ville2 rue3  npa3  ville3
    ----------------------------------------------------------
    Paul  'des pommes 6' 1234 Paris 'des poires 7' 1234 Paris 'des cerises 1' 1234 Paris
    Pierre 'des bananes 1' 1234 Paris NULL NULL NULL NULL NULL NULL
    (c'est égal si c'est NULL ou ' ')

    Je ne pense pas que ce soit possible sans SQL dynamic mais si vous avez une version sans je suis preneur

    MERCI INFINIMENT pour vos réponses.

    Gibono

  2. #2
    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
    hello. Une question préliminaire : as-tu une limite maximum de nombre d'adresses par personne ?

    En tout cas, si tu sais le nombre maximum, voici un bout de requête (non testé) qui devrait pouvoir le faire. Il y a peut-être mieux, je ne me suis pas beaucoup creusé la tête.

    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
    WITH cte AS (
    	SELECT p.pers_id, p.nom, a.adr_id, ROW_NUMBER() OVER (PARTITION BY p.pers_id ORDER BY a.adr_id) as rownum
    	FROM PERSONNE p
    	JOIN PERS_ADR pa ON p.pers_id = pa.pers_id
    	JOIN ADRESSE a ON pa.adr_id = a.adr_id
    )
    SELECT c.pers_id, MIN(c.nom) as Nom,
    	MIN(a1.rue) as rue1,
    	MIN(a2.rue) as rue2,
    	MIN(a3.rue) as rue3
    FROM cte c
    LEFT JOIN ADRESSE a1 ON c.adr_id = a1.adr_id AND c.rownum = 1
    LEFT JOIN ADRESSE a2 ON c.adr_id = a2.adr_id AND c.rownum = 2
    LEFT JOIN ADRESSE a3 ON c.adr_id = a3.adr_id AND c.rownum = 3
    GROUP BY c.pers_id;
    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

  3. #3
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Peut-être que le cumul de toutes les adresses dans une seule chaîne de caractères suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT		P.nom
    		, LA.liste_adresses
    FROM		dbo.personne AS P
    CROSS APPLY	(
    			SELECT		A.rue + ' ' + A.npa + ' ' + A.ville + '|'
    			FROM		dbo.adresse AS A
    			INNER JOIN	dbo.pers_adr AS PA
    						ON A.adresse_id = PA.adresse_id
    			WHERE		P.pers_id = PA.pers_id
    			FOR		XML PATH ('')
    		) AS LA(liste_adresses)
    WHERE		LA.liste_adresses IS NOT NULL
    Cela étant, il s'agit ici de présentation des données, ce qui devrait donc être traité du côté applicatif ...

    @++

  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 741
    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 741
    Points : 52 454
    Points
    52 454
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par gibono Voir le message
    Bonjour à tous,

    Je vais essayer de m'exprimer convenablement....

    J'ai une table qui représente les adresses...
    une table personne...
    et une table de jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TABLE: PERS_ADR
     
    pers_id           adresse_id
    ----------------------
    1                   1
    1                   2
    1                   3
    2                   4
    Puis-je me permettre d'attirer votre attention sur le fait que votre modèle est particulièrement mauvais ?
    En effet, votre modèle "partage" une même adresse à plusieurs personnes. Que ferez-vous si une personne déménage ? Ou que l'adresse a été mal saisie ?? Et que cette adresse pointe vers plusieurs personnes ???

    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
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour SQLPro,

    Je me suis moi aussi posé quelques questions quant à ce modèle. Effectivement il eut été plus utile de typer l'adresse.

    En revanche je ne comprends pas ce que tu veux dire par En effet, votre modèle "partage" une même adresse à plusieurs personnes : une adresse peut appartenir à plusieurs personnes, et une personne peut avoir plusieurs adresses. Il s'agit donc d'une relation n..n.

    Est-ce que ton doute réside sur le fait que comme nous n'avons pas le DDL des tables, on peut supposer qu'il manque une contrainte d'unicité sur la table PERS_ADR ?

    @++

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 741
    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 741
    Points : 52 454
    Points
    52 454
    Billets dans le blog
    5
    Par défaut
    Non, en règle général ce type de modèle est stupide.
    Une adresse ne se partage pas.
    Voyons ce qui se passerai si une telle adresse était partagée.

    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
    TABLE: ADRESSE
     
    adr_id rue             npa     ville
    ------ --------------- ------- ------------
    1      'des pommes 6'  1234    Paris
    2      'des poires 7'  1234    Paris
    3      'des cerises 1' 1234     Paris
    4      'des bananes 1' 1234     Paris
     
     
    TABLE: PERSONNE
     
    prs_id     nom
    ---------- -----------
    1          Paul
    2          Pierre
    3          Jacques
     
     
    TABLE: PERS_ADR
     
    prs_id   adr_id
    -------- --------------
    1        1
    1        2    --> adresse partagée avec prs_id 3 
    1        3
    2        4
    3        2    --> adresse partagée avec prs_id 1
    Imaginons que l'IHM nous montre les adresse de la personne 1 et que pour une raison ou pour une autre il faut modifier l'adresse 2 (par exemple elle n'est plus utilisée : donc suppression, ou encore il y a eu déménagement... donc, adresse à modifier).
    En modifiant cette adresse pour la personne 1, cela entraine de facto la modification de l'adresse de la personne 3, ce qui à l'évidence est une imbécilité.

    Que deux personnes aient la même adresse est fortuit, même s'ils vivent sous le même toit ou dans le même appartement. Le jour ou Madame X et Monsieur Y qui sont en ménage décident de se séparer, il sera impossible de dissocier l'adresse de l'un et de l'autre et donc les deux déménageront !!!!

    Donc ce modèle est stupide et une adresse ne peut et ne doit correspondre qu'à une seule personne !

    En tout état de cause, la bonne modélisation est tout simplement la suivante :

    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
    TABLE: PERSONNE
     
    prs_id     nom
    ---------- -----------
    1          Paul
    2          Pierre
    3          Jacques
     
    TABLE: ADRESSE
     
     
    adr_id prs_id    rue             npa     ville
    ------ --------- ------------- ------- ------------
    1      1         'des pommes 6'  1234    Paris
    2      1         'des poires 7'  1234    Paris
    3      1         'des cerises 1' 1234    Paris
    4      2         'des bananes 1' 1234    Paris
    5      2         'des poires 7'  1234    Paris
    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/ * * * * *

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    :-)

    Je suis en train de revoir tous les messages que j'ai posté sur ce merveilleux site d'échange.... et je suis tombé sur celui-ci.....

    J'en profite pour ajouter un grand MERCI avec 2 ans de retard

    Je ne voulais pas polémiquer sur la partie modélisation.... je voulais juste savoir comment réaliser la chose techniquement avec une requête....

    Ceci dit.... je ne suis pas d'accord avec votre point de vue. On peut imaginer une table adresse qui recense l'ensemble des rues et numéro d'une ville par exemple... Ensuite, une personne peut habiter à une ou plusieurs adresses. Si elle déménage, on change sa relation N, N et c'est tout bon.

    Une personne peut habiter dans une ou des {rue + numéro}. Dans une {rue + numéro} on peut avoir plusieurs personnes (habitants).

    Dans le dernier exemple, soit on ne peut avoir qu'une personne par adresses (rue + numéro), soit il faut dupliquer les lignes pour chaque habitants. Que se passe-t-il si on doit changer le nom de la rue? Comment capitalise-t-on les adresses si on en a besoin dans plusieurs relations? On se retrouve toujours en relation avec des personnes vivantes. Par exemple, si on a besoin des adresses pour définir les emplacements de monuments, d'adresses pour définir des emplacements de personnes, ...

    Bref, vieux sujet, vieille discussion.

    Merci encore pour la solution technique.

    Gibono

Discussions similaires

  1. Requêtes multi-base
    Par nicolchr dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 12/11/2014, 12h50
  2. [AC-2007] Problème sur requètes de mise en colonne de data multis occurence
    Par becdecorail dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 05/03/2014, 16h30
  3. requêtes Multi Base avec Mot de Passe
    Par bohor2gannes dans le forum Access
    Réponses: 4
    Dernier message: 27/02/2006, 15h45
  4. requête pour ajouter données à colonne
    Par sarah67 dans le forum Access
    Réponses: 12
    Dernier message: 21/02/2006, 12h48
  5. Requête multi-base
    Par Vituret dans le forum Débuter
    Réponses: 1
    Dernier message: 04/04/2005, 17h41

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