Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2010, 11h19   #1
Invité de passage
 
Inscription : mars 2005
Messages : 8
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 8
Points : 1
Points : 1
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 :
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.
zayid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 13h37   #2
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
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 :
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.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 13h54   #3
Invité de passage
 
Inscription : mars 2005
Messages : 8
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 8
Points : 1
Points : 1
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
zayid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 16h15   #4
Invité de passage
 
Inscription : mars 2005
Messages : 8
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 8
Points : 1
Points : 1
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 :
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'
zayid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 17h07   #5
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
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.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h21.


 
 
 
 
Partenaires

Hébergement Web