Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
727 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Problème avec les jointures

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec les jointures

n°1595164
cosmoschtr​oumpf
dawa powered
Posté le 02-08-2007 à 18:33:17  profilanswer
 

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
mood
Publicité
Posté le 02-08-2007 à 18:33:17  profilanswer
 

n°1595240
cosmoschtr​oumpf
dawa powered
Posté le 02-08-2007 à 22:30:19  profilanswer
 
n°1595257
TheRom_S
Posté le 02-08-2007 à 23:53:51  profilanswer
 

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
n°1595283
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-08-2007 à 08:59:43  profilanswer
 

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?

n°1595309
cosmoschtr​oumpf
dawa powered
Posté le 03-08-2007 à 10:15:54  profilanswer
 

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
n°1595353
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-08-2007 à 11:08:25  profilanswer
 

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
n°1595359
cosmoschtr​oumpf
dawa powered
Posté le 03-08-2007 à 11:19:38  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Problème avec les jointures

 

Sujets relatifs
[ACCESS]problème d'ouverture d'applicationProblème de mise en page sous EXCEL à conditions multiples
Probleme avec une dll activeX[HTML] Internet explorer problème
[MySQL] probleme de clé etrangereProblème d'URL avec Lynx
Probleme Webservice serialisation AXIS --> Client .Net C#Probleme de listing alphabétique et LIMIT avec jointures 1:n
Problème de jointures multiplesTit probleme SQL avec les jointures
Plus de sujets relatifs à : Problème avec les jointures


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR