[SQLServer, C#] Jointures sur une même table : c'est possible ?

Jointures sur une même table : c'est possible ? [SQLServer, C#] - SQL/NoSQL - Programmation

Marsh Posté le 23-09-2003 à 12:14:52    

J'ai une table Clients et une table Adresses.
Ds ma table Clients, j'ai 3 ID qui pointent sur 3 adresses différentes.
Comment récupérer mon client et ses 3 adresses en 1 seule requête ?


Message édité par WhyMe le 23-09-2003 à 13:07:49
Reply

Marsh Posté le 23-09-2003 à 12:14:52   

Reply

Marsh Posté le 23-09-2003 à 12:28:08    

SQL pur ? SGBD utilisé ? un peu de prog avec ?
 
j'ai une soluce pour du php si tu veux


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 23-09-2003 à 12:30:29    

SqlServer, C# et ASP.Net
Donne tjs ta solution pour PHP, çà m'aidera sûrement !

Reply

Marsh Posté le 23-09-2003 à 12:36:39    

tu récupères 3 lignes contenant le même client mais les 3 adresses différentes en faisant une jointure normale (en utilisant les ID)
 
à l'affichage avec une boucle classique, tant que le client ne change pas tu ne le réaffiches pas mais tu affiche juste l'adresse  
 
donc au premier résultat tu affiche tous les champs retournés, ensuite uniquement les champs de l'adresse, si le nom (ou l'id) change on recommence avec les champs du client
 
en php ça se fait très bien à coup de mysql_data_seek() & co
 
j'utilise ce genre de système pour des stats, plutôt que de faire X requêtes, je récupères toutes les infos en une passe et je déplace le pointeur pour afficher les champs utiles (à l'usage c'est bien plus rapide, la quantité d'info est la même mais tu gagnes car tout est en mémoire)


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 23-09-2003 à 12:40:44    

Ouais ...
C'est un peu + compliqué que çà en réalité ...
Je ne pense pas pouvoir adapter ta méthode pour mon pb, mais je vais essayer qd même
 
Parce que ma requête ressemble à çà, et elle n'est pas terminée  :pt1cable:  
 

Code :
  1. SELECT Customers.*,
  2.  ISNULL ( Customers.CompanyName, Customers.LastName ) AS CustomerName,
  3.  Civilities.Civility,
  4.  CustomerTypes.CustomerType,
  5.  CustomerCategories.CustomerCategory,
  6.  JustifyingDocumentTypes.JustifyingDocumentType,
  7.  CustomerStatus.CustomerStatus,
  8.  Periodicities.Periodicity,
  9.  PaymentTypes.PaymentType,
  10.  Addresses.*,
  11.  Contacts.FirstName AS Contact_FirstName,
  12.  Contacts.LastName AS Contact_LastName,
  13.  Contacts.ID_Civility AS Contact_ID_Civility,
  14.  Contacts.PhoneNumber AS Contact_PhoneNumber,
  15.  Contacts.FaxNumber AS Contact_FaxNumber,
  16.  Contacts.MobileNumber AS Contact_MobileNumber,
  17.  Contacts.Email AS Contact_Email,
  18.  Contacts.ID_JustifyingDocumentType AS Contact_ID_JustifyingDocumentType,
  19.  Contacts.JustifyingDocumentNumber AS Contact_JustifyingDocumentNumber,
  20.  Contacts.ID_Address AS Contact_ID_Address
  21. FROM  Customers
  22.  INNER JOIN CustomerCategories ON Customers.ID_CustomerCategory = CustomerCategories.ID_CustomerCategory
  23.  INNER JOIN CustomerStatus ON Customers.ID_CustomerStatus = CustomerStatus.ID_CustomerStatus
  24.  INNER JOIN CustomerTypes ON Customers.ID_CustomerType = CustomerTypes.ID_CustomerType
  25.  LEFT JOIN Civilities ON dbo.Customers.ID_Civility = dbo.Civilities.ID_Civility
  26.  INNER JOIN Periodicities ON Customers.ID_Periodicity = Periodicities.ID_Periodicity
  27.  INNER JOIN JustifyingDocumentTypes ON Customers.ID_JustifyingDocumentType = JustifyingDocumentTypes.ID_JustifyingDocumentType
  28.  INNER JOIN PaymentTypes ON PaymentTypes.ID_PaymentType = Customers.ID_PaymentType
  29.  INNER JOIN Addresses ON Addresses.ID_Address = Customers.ID_Address
  30.  INNER JOIN Contacts ON Contacts.ID_Contact = Customers.ID_Contact
  31. WHERE Customers.ID_ImportationLogSource = @ImportationLogID
  32.  OR Customers.ID_ImportationLogLastModification = @ImportationLogID


 
D'autres IDs ?

Reply

Marsh Posté le 23-09-2003 à 12:55:03    

commence par changer ton titre en éditant ton premier post et ajoute que c'est du MSSQL, C# & co, peut être qu'un peu plus de monde passera


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 23-09-2003 à 13:02:40    

Là c'est la pause déjeuner, c'est peut être pour çà qu'y a pas gd monde :D

Reply

Marsh Posté le 23-09-2003 à 14:57:06    

Personne d'autre ?  :sweat:

Reply

Marsh Posté le 23-09-2003 à 16:27:37    

Whynot !
 
SQL server ?
Que veux tu faire exactement ?
 
Tu peux donner un jeu d'essai et ce que  
tu veux obtenir style
 
tab_client  
=>
id_c adresse
----------------
1    001
1    002
2    003
3    001
 
 
tab_Adresse
=>
id_a libelle
---------------------
001  rue des larmes  
002  rue des pieds
003  avenue bourgogne
 
et le résultat
id_c libelle
-----------------
...


Message édité par vttman2 le 23-09-2003 à 16:28:11
Reply

Marsh Posté le 23-09-2003 à 19:54:13    

la maniere dont j'ai compris le truc
table client
id id_adr1 id_adr2 id_adr3
 
table adresse.
id, libelle
 
Alors moi je ferais comme ca
Select cl.id, adr_1.libelle, adr_2.libelle, adr_3.libelle
from client cl,
adresse adr_1,
adresse adr_3,
adresse adr_2
where
id_adr1 = adr_1.id
and
id_adr2 = adr_2.id
and
id_adr3 = adr_3.id
 
Je dis peut etre de grosses conneries hein mais je crois pas.

Reply

Marsh Posté le 23-09-2003 à 19:54:13   

Reply

Marsh Posté le 24-09-2003 à 08:35:59    

Sébastien a écrit :

la maniere dont j'ai compris le truc
table client
id id_adr1 id_adr2 id_adr3
 
table adresse.
id, libelle
 
Alors moi je ferais comme ca
Select cl.id, adr_1.libelle, adr_2.libelle, adr_3.libelle
from client cl,
adresse adr_1,
adresse adr_3,
adresse adr_2
where
id_adr1 = adr_1.id
and
id_adr2 = adr_2.id
and
id_adr3 = adr_3.id
 
Je dis peut etre de grosses conneries hein mais je crois pas.
 


 
+1 je pense aussi qu'il demande un truc comme ça  ;)  
 
Select cl.id, adr_1.libelle, adr_2.libelle, adr_3.libelle
from client cl,
adresse adr_1,
adresse adr_3,
adresse adr_2
where
cl.id_adr1 = adr_1.id
and
cl.id_adr2 = adr_2.id
and
cl.id_adr3 = adr_3.id

Reply

Marsh Posté le 24-09-2003 à 09:48:24    

Bon, bah j'ai trouvé ( en fait c'est plutôt mon chef de projet qui a trouvé  :D )
Il faut utiliser des alias de table et les LEFT OUTER JOIN, et çà donne une requête comme çà ( juste pour le nom de la voie ) :
 

Code :
  1. SELECT      Customers.ID_Customer,
  2.  CustomerAddresses.WayName AS [Customer.WayName],
  3.  ContactAddresses.WayName AS [ContactAddresses.WayName],
  4.  InvoicingAddresses.WayName AS [InvoicingAddresses.WayName]
  5. FROM  Customers
  6.  LEFT OUTER JOIN Contacts ON Customers.ID_Contact = Contacts.ID_Contact
  7.  LEFT OUTER JOIN Addresses CustomerAddresses ON Customers.ID_Address = CustomerAddresses.ID_Address
  8.  LEFT OUTER JOIN Addresses InvoicingAddresses ON Customers.ID_InvoicingAddress = InvoicingAddresses.ID_Address
  9.  LEFT OUTER JOIN Addresses ContactAddresses ON Contacts.ID_Address = ContactAddresses.ID_Address


 
Et le résultat :
http://prolink.org/procycles/_Temp/Jointures.jpg
 
 [:spikler]


Message édité par WhyMe le 24-09-2003 à 09:48:46
Reply

Marsh Posté le 24-09-2003 à 09:51:05    

C'est ce qu'on avait dit donc ^^

Reply

Marsh Posté le 24-09-2003 à 10:09:25    

En gros ouais  :jap:

Reply

Sujets relatifs:

Leave a Replay

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