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 :

[jointure] Petit problème sur le type de jointure...


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut [jointure] Petit problème sur le type de jointure...
    Bonjour.
    J'ai actuellement 2 tables : personne et employe. La table employe répète exactement tout ce qui figure dans personne et ajoute 2 colonnes. Certains vont peut être hurler de voir ca car une jointure serait la bienvenue mais c'est en fait le produit de la norme jdo qui permet le mapping d'objets java en automatisant un peu plus le processus qu'avec jdbc pour ceux qui connaissent...
    Bref, mon problème est de savoir comment dois je faire pour pouvoir faire une requête qui fasse une jointure de tous les tuples entre les tables pour me rendre "une seule table avec tous les champs d'accessibles avec leur nom direct, par exemple nom, prenom,... et non pas personne.nom,...
    Je sèche un peu sur le type de jointure.

    SQL> describe employe;
    Nom NULL ? Type
    ----------------------------------------- -------- ----------------------------
    LIDOID NOT NULL NUMBER
    NUMPERS NUMBER
    NOM VARCHAR2(50)
    PRENOM VARCHAR2(50)
    DATENAISS TIMESTAMP(6)
    ADRESSE VARCHAR2(50)
    VILLE VARCHAR2(50)
    CP VARCHAR2(50)
    NOMENTREPRISE VARCHAR2(50)
    SALAIRE NUMBER

    SQL> describe personne;
    Nom NULL ? Type
    ----------------------------------------- -------- ----------------------------
    LIDOID NOT NULL NUMBER
    NUMPERS NUMBER
    NOM VARCHAR2(50)
    PRENOM VARCHAR2(50)
    DATENAISS TIMESTAMP(6)
    ADRESSE VARCHAR2(50)
    VILLE VARCHAR2(50)
    CP VARCHAR2(50)
    Pouvez vous m'aidez un peu svp ?
    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    D'abord une question : pourquoi faire une jointure si tu as tous les champs dans la table employe ? Est-ce parce que les contenus risquent d'être différents ? Si oui, tu sais maintenant pourquoi "certains vont peut-être hurler".

    Si j'ai bien compris ton problème, mais c'est pas sur, tu peux faire ta jointure (sur LIDOID, ou sur NUMPERS, on dirait qu'il y a deux identifiants dans ces tables) en utilisant des alias pour les noms de colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT PERSONNE.NOM AS NOM ...
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Concernant le lidoid, j'aimerais le supprimer mais j'ai quelques problèmes pour l'instant donc il reste.
    Le contenu des 2 tables est bien différent.
    Si la personne N°36 est un salarié, elle sera stocké dans la table employé alors que la personne 45 qui n'est pas un salarié sera exclusivement stocké dans la table Personne.
    Pour ceux qui cherchent une explication à cela, vous la trouverez ci dessous :
    C'est bien ça, une nouvelle table par classe concrète en cas d'héritage, c'est le mapping le plus efficace en pratique sur l'ensemble des situations. Ce que vous semblez réclamer est du "mapping vertical" qui est très lourd en pratique car nécessite énormément de jointures. Attention au vocabulaire, les données NE SONT PAS stockées 2 fois, pour moi les données sont les tuples ou lignes d'enregistrement dans la base. Vous voulez dire sûrement que les mêmes COLONNES sont stockées 2 fois (dupliquées), c'est très différent. Je vous invite à rechercher sur Internet les différents types de mapping objet-relationnel comme http://www.agiledata.org/essays/mappingObjects.html, vous y trouverez les arguments justifiant que LiDO fasse un tel mapping pour le maximum d'efficacité.
    Donc comment dois je faire pour joindre les tables sur les attributs qui sont identiques seulement ? ce n'est pas une demi-jointure, non ? quelle instruction sql utiliser ?

    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Si j'ai bien compris :
    Un salarié est stocké dans la table Employe exclusivement, alors que les non-employés sont exclusivement dans la table Personne, c'est bien cela ? C'est comme cela que j'ai compris qu'il n'y avait pas de redondance

    Tu voudrais une requête qui te ramène les informations de toutes les personnes et de tous les employés, avec les informations supplémentaires de la table "employe", quand c'est le cas, c'est bien cela ?

    Si oui, il faut faire une UNION des 2 select en pensant à ajouter 2 champs vides dans le select sur personne, car dans une union il faut des select ramenant des données similaires (nombre et type)
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Un salarié est stocké dans la table Employe exclusivement, alors que les non-employés sont exclusivement dans la table Personne, c'est bien cela ? C'est comme cela que j'ai compris qu'il n'y avait pas de redondance
    oui, c'est ca

    Tu voudrais une requête qui te ramène les informations de toutes les personnes et de tous les employés, avec les informations supplémentaires de la table "employe", quand c'est le cas, c'est bien cela ?
    Oui, c'est bien ca.

    Pour l'union, je vais approfondir la chose, merci.
    Je pensais tout de même qu'on pouvait utiliser une jointure...
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je pensais tout de même qu'on pouvait utiliser une jointure...
    Tu ne peux pas faire de jointure... puisque tes tables sont disjointes
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Contrairement à ce que tu as dit, il est possible de faire une jointure entre deux tables disjointes pour parvenir à un équivalent de l'UNION...

    J'ai démontré cela dans la référence d'URL jointe :
    http://sqlpro.developpez.com/TECH/SQL_TEHC.html#TECH05

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

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Comme le dit SQLPro :
    Il est possible de la réaliser à deux conditions :
    que le SGBDR possède une fonction ou structure de substitution des marqueurs NULL (COALESCE, CASE... ou équivalent)
    que le SGBDR implémente le FULL OUTER JOIN
    C'est assez rare qu'il y ait ces deux éléments sans l'opérateur UNION. De plus, le coût de calcul de cet équivalent est assez élevé du fait de la présence des fonctions de transformation.
    J'en profite pour préciser à SteelBox, qu'une UNION ALL évitera au moteur de chercher des doublons qui ne peuvent pas exister avec des tables disjointes
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  9. #9
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Mes cours de sql sont un peu loin et je ne me rappelle plus comment on fait pour ajouter des champs fictifs dans le select...pouvez vous m'aidez.
    Voici ce que j'ai pour l'instant (sans les champs salaire et nomentreprise) :
    select s_personne.* from s_personne
    union
    select numpers,nom,prenom,datenaiss,adresse,ville,cp from s_employe
    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    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
    SELECT 
      champ1,
      champ2,
      champ3,
      champ4
    FROM Table1
     
    UNION
     
    SELECT
      champ1,
      champ2,
      '' AS champ3,
      '' AS champ4
    FROM Table2

  11. #11
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Merci beaucoup ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select s_personne.*,' ' as nomentreprise,0 as salaire from s_personne 
    union 
    select numpers,nom,prenom,datenaiss,adresse,ville,cp,nomentreprise,salaire from s_employe
    Lz requête finale donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select * from (select s_personne.*,' ' as nomentreprise,0 as salaire from s_personne 
    union 
    select * from s_employe) where numpers=12
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Points : 4 657
    Points
    4 657
    Par défaut
    SteelBox, c'est la balise Code qu'il faut utiliser par Quote

  13. #13
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Désolé, je me suis trompé...
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Points : 4 657
    Points
    4 657
    Par défaut
    Citation Envoyé par SteelBox
    Désolé, je me suis trompé...
    Pas bien grave :-)

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 20/01/2011, 12h45
  2. petit problème sur les listes chaînées
    Par poche dans le forum C
    Réponses: 14
    Dernier message: 19/03/2007, 16h53
  3. petite question sur les types de champs
    Par charlie koller dans le forum Débuter
    Réponses: 2
    Dernier message: 21/02/2007, 17h57
  4. petit problème sur une drawgrid
    Par florette dans le forum Delphi
    Réponses: 2
    Dernier message: 26/05/2006, 09h41
  5. [débutant]petit problème sur formulaire avec onglets
    Par Christophe93250 dans le forum Access
    Réponses: 2
    Dernier message: 06/01/2006, 10h46

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