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

 Oracle Discussion :

problème sql pour données contacts splittés dans 2 tables


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut problème sql pour données contacts splittés dans 2 tables
    j'ai 2 tables contacts:

    - address: une table sandard que je suis obligé d'utiliser
    - addonaddress: une table qui me permet de définir des champ qui ne seraient pas dans la table standard "address"

    Un contact est donc une entrée de la table address + une entrée de la table addonaddress (avec le même ID).

    Un contact peut-être de type "company" ou "contact" (un membre de la compagnie). Si le contact est de type "contact", on remplit le champ "parent" (dans la table addonaddress) avec l'ID de la compagnie à laquelle il appartient.

    Mon problème est le suivant...

    Je voudrais faire une requête qui me donnerait à la fois la liste des compagnies (sans contact) et la liste des contacts (avec la compagnie).

    J'ai écrit 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
    19
    20
    21
    22
    SELECT 
    compa.id CustomerNr, 
    compa.companyname Company, 
    compaa.street Street,        (street de la compagnie)
     
    conta.id ContactID, 
    conta.lastname Lastname, 
    conta.firstname Firstname
    contaa.street Street,        (street de la personne... peut être différent de la compagnie)
     
    FROM 
     
    address compa, addonaddress compaa, 
     
    address conta, addonaddress contaa 
     
    WHERE 
     
    compa.id = compaa.id 
    AND conta.id = contaa.id
    AND contaa.parent = compa.id
    AND compa.id LIKE '$CustomerNr'
    Mais ainsi, je n'ai pas les compagnies seules... Mais bien tous les contacts appartenant à la même compagnie.

    Je sais que c'est parce que je mets "contaa.parent = compa.id" mais je ne sais pas comment faire pour avoir les compagnies seules (pour le cas où il faudrait lié une facture par exemple à la compagnie elle-même et pas à une personne de la compagnie)

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Si j'ai bien compris, tu veux:
    - 1 ligne par compagnies (avec les informations de la compagnie) qui n'ont aucun contact
    - n lignes par compagnies (avec les informations de la compagnie) et par contact de la compagnie (avec les informations du contact) quand le contact existe.

    Ca devrait le faire.
    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
    SELECT 
    	compa.id CustomerNr, 
    	compa.companyname Company, 
    	compaa.street Street,        (street de la compagnie)
     
    	"CONTACT".id ContactID, 
    	"CONTACT".lastname Lastname, 
    	"CONTACT".firstname Firstname
    	"CONTACT".street Street,        (street de la personne... peut être différent de la compagnie)
    FROM 
    	address compa
    	inner join addonaddress compaa on (compa.id = compaa.id) 
    	left outer join
    	(
    	 	 address conta
    		 inner join addonaddress contaa on (conta.id = contaa.id)
    	) "CONTACT" on ( "CONTACT".parent = compa.id )
    WHERE
    	compa.id LIKE '$CustomerNr'
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    C'est tout à fait ça dans le principe que tu décris.

    Je vais essayer de comprendre d'abord ta requête à base de JOIN que je n'ai jamais utilisé...

    Ensuite, je la testerai je repasserai pour te dire si ça a fonctionné

    Merci beaucoup en tout cas

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ok, je pense avoir compris le principe...

    Tu joins les 2 tables pour la compagnie (INNER JOIN) pour n'avoir plus qu'une table, tu fais de même avec les contacts (second INNER JOIN... Là si je comprends bien, on a 2 tables identiques, non?) et tu fais un LEFT OUTER JOIN pour avoir les concordances là où l'ID de la compagnie vaut le champ "parent" (on aura les contacts + les infos compagnie) + les résultats non concordants de la table de gauche (ici, la compagnie, donc les infos de compagnie seules)...

    C'est bien ça?

    Petit problème... j'ai un problème de syntaxe avec l'alias "CONTACT"...

    Je peux m'en passer et 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
    19
    SELECT 
    	compa.id CustomerNr, 
    	compa.companyname Company, 
    	compaa.street Street,        (street de la compagnie)
     
    	conta.id ContactID, 
    	conta.lastname Lastname, 
    	conta.firstname Firstname
    	contaa.street Street,        (street de la personne... peut être différent de la compagnie)
    FROM 
    	address compa
    	inner join addonaddress compaa on (compa.id = compaa.id) 
    	left outer join
    	(
    	 	 address conta
    		 inner join addonaddress contaa on (conta.id = contaa.id)
    	) on ( contaa.parent = compa.id )
    WHERE
    	compa.id LIKE '$CustomerNr'

  5. #5
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Oui tu as compris.

    Normalement oui tu peux. C'est vrai que je suis un peu un psychopathe de l'alias mais je pense que ça marche. D'ailleurs tu as déjà du tester.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Discussions similaires

  1. problème pour effacer des entrées dans 2 tables jointes
    Par Jasmine80 dans le forum Requêtes
    Réponses: 8
    Dernier message: 02/03/2009, 10h48
  2. problème pour éviter les doublons dans une table
    Par bonnet85 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/02/2008, 04h35
  3. Problème SMTP pour un compte yahoo dans Outlook 2003
    Par maxmarie dans le forum Outlook
    Réponses: 1
    Dernier message: 15/02/2008, 14h13
  4. [A97] VBA : Commande sql pour insertion de champs dans une table
    Par JeremieT dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/07/2006, 13h12
  5. [SQL] Récupération de données et Insert dans une table
    Par heteroclite dans le forum PHP & Base de données
    Réponses: 32
    Dernier message: 12/07/2006, 16h17

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