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

Langage SQL Discussion :

Comparer sur une même table


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comparer sur une même table
    Bonjour à tous,

    J'ai besoin de votre aide sur une requête SQL

    J'ai 4 tables (simplifié)

    Etablissements : id_etablissement, nom
    Succursales : id_succursal, nom, #id_etablissement
    Service : id_service, désignation
    Actif : #id_service, #id_etablissement, #id_succursal


    La requête consiste à trouver les succursales (id_succursal, nom, service) qui proposent des services différents de leur établissement principal
    Le problème c'est que j'ai plusieurs services actifs sur un établissement et ma requête ne sort pas que les différences

    Je suis sur SQL server mais je prends toutes les propositions

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Il s'agit d'un cas de division relationnelle qui se résous généralement par l'emploi de l'opérateur de quantification EXISTS.

    Vous devez trouver les succursales dont aucun service n'existe dans la maison mère, aucun se traduisant par NOT EXISTS.

    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/ * * * * *

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre réponse, je vais tester ça.

    Je connais l'opérateur Exists mais ça m'a l'air un peu trop restrictif pour mon cas.
    Si un service seulement de la succursale n'existe pas pour la maison mère ça va pas marcher ?
    Puis tous les services des MM et des succursales sont présentes dans la même table "Actif" donc Exists ne peut pas marcher je me trompe ?

  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 768
    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 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Davidu75 Voir le message
    Merci pour votre réponse, je vais tester ça.

    Je connais l'opérateur Exists mais ça m'a l'air un peu trop restrictif pour mon cas.
    Si un service seulement de la succursale n'existe pas pour la maison mère ça va pas marcher ?
    Puis tous les services des MM et des succursales sont présentes dans la même table "Actif" donc Exists ne peut pas marcher je me trompe ?
    respectez la charte de postage en fournissant le DDL des tables et un jeu d'essai. Ainsi nous pourrons vous prouver comment ça marche.

    A lire : https://www.developpez.net/forums/a6...gage-sql-lire/

    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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oui désolé cela devrait être mieux maintenant

    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
    45
    46
    47
    48
     
    Create table Etablissements
    (id_etablissement integer, 
    nom_MM VARCHAR(255),
    PRIMARY KEY (id_etablissement))
     
    Create table Succursales
    ( id_succursal integer, 
    nom_succ VARCHAR(255),
    id_etablissement integer,
    PRIMARY KEY (id_succursal),
    CONSTRAINT FK_succursales  FOREIGN KEY (id_etablissement)
    REFERENCES Etablissements(id_etablissement)
    )
     
    Create table Service
    (id_service integer, 
    désignation_service VARCHAR(255),
    PRIMARY KEY (id_service)
    )
     
    Create table Actif
    (id_service integer, 
    id_etablissement integer,
    id_succursal integer,
    )
     
    INSERT INTO Etablissements(id_etablissement, nom_MM) VALUES (1, 'etablissement_a')
    INSERT INTO Etablissements(id_etablissement, nom_MM) VALUES (2, 'etablissement_b')
     
    INSERT INTO Succursales(id_succursal, nom_succ, id_etablissement) VALUES (1, 'succursal_x', 1)
    INSERT INTO Succursales(id_succursal, nom_succ, id_etablissement) VALUES (2, 'succursal_y', 1)
    INSERT INTO Succursales(id_succursal, nom_succ, id_etablissement) VALUES (3, 'succursal_z', 1)
     
    INSERT INTO Service(id_service, désignation_service) VALUES (1, 'Crédit')
    INSERT INTO Service(id_service, désignation_service) VALUES (2, 'Epargne')
    INSERT INTO Service(id_service, désignation_service) VALUES (3, 'Assurance')
     
    INSERT INTO Actif(id_service, id_etablissement, id_succursal) VALUES (1, 1, NULL) --'etablissement_a'
    INSERT INTO Actif(id_service, id_etablissement, id_succursal) VALUES (2, 1, NULL) --'etablissement_a'
     
    INSERT INTO Actif(id_service, id_etablissement, id_succursal) VALUES (1, NULL, 1) --'succursal_x'
    INSERT INTO Actif(id_service, id_etablissement, id_succursal) VALUES (2, NULL, 1) --'succursal_x'
     
    INSERT INTO Actif(id_service, id_etablissement, id_succursal) VALUES (1, NULL, 2) --'succursal_y'
    INSERT INTO Actif(id_service, id_etablissement, id_succursal) VALUES (3, NULL, 2) --'succursal_y'
     
    INSERT INTO Actif(id_service, id_etablissement, id_succursal) VALUES (3, NULL, 3) --'succursal_z'

    Le résultat que je veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id_succursal    nom_succ       désignation_service  id_etablissement    nom_MM
    -----------   ------------	-------------       --------------   --------------
    2	      succursal_y        Assurance		1            etablissement_a
    3	      succursal_z        Assurance		1            etablissement_a

  6. #6
    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 comme ceci :

    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
     
    SELECT		
    			S.id_succursal
    		,	s.nom as nom_succ
    		,	Srv.désignation as designation_service
    		,	E.id_etablissement
    		,	E.nom as nom_etablissement		
    FROM		Succursales S
    INNER JOIN	Etablissements E
    	ON		E.id_etablissement = S.id_etablissement
    INNER JOIN	Actif A
    	ON		A.id_succursal =   S.id_succursal
    INNER JOIN	Service Srv
    	ON		Srv.id_service = A.id_service
    LEFT JOIN	Actif Etab
    	ON		Etab.id_etablissement = E.id_etablissement
    	AND		Etab.id_service = A.id_service
    WHERE Etab.id_etablissement IS NULL
    Attention, cela ne ressort pas les succursales qui ont des services en moins par rapport à leur établissement, uniquement celles ayant des services en plus, ce qui semble être ce que vous voulez.

Discussions similaires

  1. [MySQL] Plusieurs même requetes sur une même table
    Par bibom dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 27/07/2006, 12h54
  2. [DEB] Sousform et Form sur une même table
    Par ip203 dans le forum IHM
    Réponses: 1
    Dernier message: 08/06/2006, 13h23
  3. Sum différents sur sur une même table ...
    Par Saloucious dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/10/2005, 15h51
  4. Réponses: 2
    Dernier message: 29/09/2004, 09h07
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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