Problème avec les jointures

Problème avec les jointures - SQL/NoSQL - Programmation

Marsh Posté le 02-08-2007 à 18:33:17    

kookoo :o
 
Je (toujours) suis une merde en SQL et j'ai besoin de votre aide :o
 
J'ai 3 tables : entreprise, agence (liée à entreprise), contact (liée à agence)
 
Je veux récupérer toutes mes valeurs entreprises/agences/contacts (facile, sauf les contacts)
Le problème, c'est que des fois y'a pas de contact, donc forcément, avec un inner join ça me sors pas les agences/entreprises sans contact.
Je connais que le inner join en sql. J'ai testé avec un outer join (left, right, full), mais ça me met soit beaucoup trop (une ligne par contact présent sauf que j'en veux qu'un), soit pas assez d'enregistrement (quand je filtre les contacts avec un where, ça ne me met plus que les agences qui ont des contacts).
 
Du coup, pour le moment je m'en sors avec un sous-select, mais comme j'ai pas mal de champs à récupérer de la table contact, j'ai pas envie de faire un sous-select par champ... :/
 
Comment est-ce que je peux avoir une requête simple ? :o
 
marki [:romf]


---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux
Reply

Marsh Posté le 02-08-2007 à 18:33:17   

Reply

Marsh Posté le 02-08-2007 à 22:30:19    

Reply

Marsh Posté le 02-08-2007 à 23:53:51    

Tu peux faire le outer join qui te met une ligne par contact et ensuite grouper par agence ou par entreprise si tu préfère. Le truc c'est de pas récupérer les champs de la table contact ((juste te servir de la table pour le outer join) pour qu'il puisse grouper par agence/entreprise


---------------
The Rom's, à votre service
Reply

Marsh Posté le 03-08-2007 à 08:59:43    

la piste de TheRom_s est bonne mais puisque tu as besoin des infos contact oublie la fin sur le group.
 
Deux petites questions complémentaires:
- tu veux remonter une ligne par agence ou une ligne par contact? Si c'est une ligne par agence comme doivent être présentés les contact
- quel SGBD?

Reply

Marsh Posté le 03-08-2007 à 10:15:54    

TheRom_S a écrit :

Tu peux faire le outer join qui te met une ligne par contact et ensuite grouper par agence ou par entreprise si tu préfère. Le truc c'est de pas récupérer les champs de la table contact ((juste te servir de la table pour le outer join) pour qu'il puisse grouper par agence/entreprise


ah oui mais justement, j'ai besoin de récupérer des champs de la table contact !
comment est-ce que tu ferais cette requête sinon ?
 

anapajari a écrit :

la piste de TheRom_s est bonne mais puisque tu as besoin des infos contact oublie la fin sur le group.
 
Deux petites questions complémentaires:
- tu veux remonter une ligne par agence ou une ligne par contact? Si c'est une ligne par agence comme doivent être présentés les contact
- quel SGBD?


- je veux remonter une ligne par agence, chaque agence a un contact (et un seul) qui a un tag "contact principal", ou alors pas de contact principal. Donc pour chaque ligne d'affichage on a : nom de l'entreprise, adresse de l'agence, nom du contact ; ou alors la même chose mais pas de nom de contact
- SQL Server 2005
 
edit : ma requête aujourd'hui c'est ça :

Code :
  1. SELECT dbo.e_entreprise.entr_id, dbo.e_entreprise.entr_raisonsociale,
  2. dbo.e_entreprise.entr_mail, dbo.e_agence.agence_rue1, dbo.e_agence.agence_rue2,
  3. dbo.e_agence.agence_rue3, dbo.e_agence.agence_codepostal, dbo.e_agence.agence_ville,
  4. dbo.e_agence.agence_telephone,
  5. (SELECT TOP (1) dbo.c_civilite.civilite_label + ' ' +
  6. COALESCE (dbo.c_contact.contact_nom, '') + ' ' + COALESCE (dbo.c_contact.contact_prenom, '')
  7. AS nom
  8. FROM dbo.c_contact INNER JOIN
  9. dbo.c_civilite ON dbo.c_contact.civilite_id = dbo.c_civilite.civilite_id
  10. WHERE (dbo.c_contact.contact_privilegie_adher_tag = 1) AND (dbo.c_contact.agence_id =
  11. dbo.e_agence.agence_id)) AS contact,
  12. dbo.e_agence.departement_id, dbo.e_entreprise.typemembre_id,
  13. dbo.e_entreprise.entr_codeape, dbo.e_entreprise.entr_numsiren,
  14. dbo.e_entreprise.isotype_id, dbo.e_entreprise.entr_maisonmere_tag,
  15. dbo.e_agence.agence_principale_tag,
  16. dbo.e_entreprise.entr_reglementcotisation_tag, dbo.e_entreprise.statut_id,
  17. dbo.e_entreprise.entr_effectif_comptable,
  18. dbo.e_entreprise.entr_effectif_guide
  19. FROM dbo.e_entreprise INNER JOIN
  20. dbo.e_agence ON dbo.e_entreprise.entr_id = dbo.e_agence.entr_id
  21. WHERE (dbo.e_agence.agence_valide = 1) AND (dbo.e_entreprise.entr_valide = 1)


 
merci [:romf]


Message édité par cosmoschtroumpf le 03-08-2007 à 10:25:03

---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux
Reply

Marsh Posté le 03-08-2007 à 11:08:25    

Code :
  1. SELECT
  2. ...
  3. FROM
  4.  
  5.                    dbo.e_entreprise
  6. INNER JOIN          dbo.e_agence    ON dbo.e_entreprise.entr_id = dbo.e_agence.entr_id
  7. LEFT OUTER JOIN     dbo.c_contact   ON dbo.c_contact.agence_id = dbo.e_agence.agence_id AND dbo.c_contact.contact_privilegie_adher_tag = 1
  8. LEFT OUTER JOIN     dbo.c_civilite  ON dbo.c_contact.civilite_id = dbo.c_civilite.civilite_id
  9. WHERE
  10.    dbo.e_agence.agence_valide = 1
  11. AND dbo.e_entreprise.entr_valide = 1


un truc dans le genre mais 2/3 remarques:
- l'erreur à ne pas faire c'est de mettre dans le where de ta requête une condition sur un champs d'une des tables "left-jointée" ( si ça existe comme mot). Cela a pour fait dans transformer l'outer en inner.
- en toute théorie c'est un inner qu'il devrait y avoir entre contact et civilité pour eviter qu'un contact avec une civilité inexistante ne remonte. Mais si tu fais inner entre eux, ça transforme également ton outer.

Message cité 1 fois
Message édité par anapajari le 03-08-2007 à 11:09:22
Reply

Marsh Posté le 03-08-2007 à 11:19:38    

anapajari a écrit :

un truc dans le genre mais 2/3 remarques:
- l'erreur à ne pas faire c'est de mettre dans le where de ta requête une condition sur un champs d'une des tables "left-jointée" ( si ça existe comme mot). Cela a pour fait dans transformer l'outer en inner.
- en toute théorie c'est un inner qu'il devrait y avoir entre contact et civilité pour eviter qu'un contact avec une civilité inexistante ne remonte. Mais si tu fais inner entre eux, ça transforme également ton outer.


okay merci beaucoup ! [:ginie]
je comprend mieux [:romf]
avec l'explication des transformations en inner join je comprend mieux le comportement dans mes tests :D je savais pas qu'on pouvait faire un AND dans les clauses ON :o
pour la civilité c'est un champ not null, donc un contact a forcément une civilité :)
 
merci :jap:


Message édité par cosmoschtroumpf le 03-08-2007 à 11:20:11

---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed