|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre éclairé
![]() Développeur Sharepoint/Biztalk Inscription : octobre 2008 Messages : 501 ![]() |
Bonjour,
Je rencontre un gros soucis, sur lequel je bloque depuis quelques heures .. J'ai un dataset qui comporte 4 tables. J'ai une table principale qui comporte des éléments (dont une clé primaire) et 3 tables annexes. Les 3 tables sont indépendantes mais comportent des caractéristiques par rapport à la clé primaire de la table principale. J'aimerais faire une requête qui récupére tous les enregistrements où table1.cléprimaire = table2.ID && ( || ?) table1.cléprimaire = table3.ID && ( || ?) table1.cléprimaire = table4.ID && ( || ?) J'ai tenté cette requête : Code :
En sql je sais faire, mais j'ai du mal à traduire :/ J'ai regardé beaucoup de tuto, mais souvent pas de join multiple, ou alors leur solution ne fonctionne pas chez moi, je dois louper une étape .. Merci ! |
||
|
|
00
|
|
|
#2 |
![]() ![]() Thomas LevesqueDéveloppeur .NET Inscription : février 2004 Messages : 16 721 ![]() |
Est-ce que la clé existe dans toutes les tables ? S'il y a ne serait-ce qu'une table où elle n'existe pas, ça ne renvoie rien pour cette clé... Ou alors il faut faire une jointure externe
__________________
Pas de questions techniques par MP ! Le forum est là pour ça... |
|
00
|
|
|
#3 |
|
Membre éclairé
![]() Développeur Sharepoint/Biztalk Inscription : octobre 2008 Messages : 501 ![]() |
Oui la clé existe dans toute les tables
Cependant il se peut que pour un élément dans la table principale, une table ne retourne rien. Pour expliquer plus le contexte, j'ai un événement dans la table principale. Cet événement comporte diverses caractéristiques. Ces caractéristiques peuvent être de type numérique, caractère etc. En fait pour un type, on a une table annexe (connexion avec SAP donc pas le choix). Cependant je pense que SQL gère très bien le fait que s'il trouve rien dans une table, il passe au reste. Cependant c'est la première fois que j'utilise linq, et je remarque que les jointures multiples sont pas si simple qu'en SQL (enfin quand une fonctionnera ca ira mieux edit : il y a du nouveau. En fait ca fonctionne sauf que lui il fait le lien entre les jointures comme du ET. Sauf que moi il faudrait des jointures en OU. Tu vois ? Comment je peux faire ca sur du join ? Merci |
|
|
00
|
|
|
#4 | |||||
![]() ![]() Thomas LevesqueDéveloppeur .NET Inscription : février 2004 Messages : 16 721 ![]() |
Citation:
Citation:
Citation:
Code :
__________________
Pas de questions techniques par MP ! Le forum est là pour ça... |
|||||
|
00
|
|
|
#5 |
|
Membre éclairé
![]() Développeur Sharepoint/Biztalk Inscription : octobre 2008 Messages : 501 ![]() |
Merci bien ca marche du feu !
Par contre j'ai un peu de mal avec les expressions "jointures externes" et "jointures internes", et sur google ca me parle de jointure gauche interne, jointure droite externe .. je me perd un peu ? C'est pour comprendre tes lignes de jointures avec les clause defaultIfEmpty() .. edit : j'ai crié victoire trop vite .. J'ai fais mes tests voir ce que je récupérais exactement de ca. Le problème arrive lorsque pour un événement principal (table principale), il existe des caractéristiques dans au moins deux des trois autres tables, il me créé un seul enregistrement en prenant la valeur dans chacun des tables (en gros au lieu de faire un enregistrement pour la 1ere caractéristique, puis un deuxième pour la 2eme caractéristique, il prend les deux champs pour le même. Travaillant sur un projet pour faire communiquer deux applications, il est nécessaire d'avoir deux lignes distinctes :/ bien que ca peut faire redondance ... Je pense qu'il doit exister une condition qui permet de dire, si une des valeurs existe, alors l'autre est nulle :/ Mais j'ai peur d'alourdir énormément ma requête, et je sais pas si c'est possible directement dans le select (mes essais sont pas très concluant). Encore merci. |
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() Développeur Sharepoint/Biztalk Inscription : octobre 2008 Messages : 501 ![]() |
Finalement j'ai compris le principe des DefaultIfEmpty, en fait on passe la main de table en table pour voir .. mais peut-on créer des enregistrements différents, même lorsqu'il trouve des correspondances entre plusieurs tables ?
edit : En fait je me suis fait un jeu de test. Admettons 4 tables : A B C D v1 v1 v2 v1 v2 v2 v2 v2 Résultat : v1 v1 v1 v1 v2 v2 v2 v2 v2 v2 v2 v2 En gros il différencie pas qu'il y a qu'une valeur dans B puis 2 dans C etc Au final il réplique autant de fois que la table où il y en aura le plus. Sauf que le logiciel d'arrivé ne saura pas gérer .. Je pensais peut-être faire ensuite un traitement pour séparer les lignes mais bon là c'est complexe et "usine à gaz". |
|
|
00
|
|
|
#7 | |
![]() ![]() Thomas LevesqueDéveloppeur .NET Inscription : février 2004 Messages : 16 721 ![]() |
Citation:
__________________
Pas de questions techniques par MP ! Le forum est là pour ça... |
|
|
00
|
|
|
#8 | ||
|
Membre éclairé
![]() Développeur Sharepoint/Biztalk Inscription : octobre 2008 Messages : 501 ![]() |
Je suis directement passé par Linq en fait.
J'ai 4 tables : A, B, C et D A se trouve au centre. B, C et D ont dont une clé étrangère de A. En fait la requête doit d'abord chercher les valeurs entre A et B, puis entre A et C, puis entre A et D où B, C et D sont complétement indépendants en fait. Je pense qu'en SQL normal ca devrait ressembler à : Code :
Je sais pas si j'arrive à expliquer :/ |
||
|
|
00
|
|
|
#9 | ||
![]() ![]() Thomas LevesqueDéveloppeur .NET Inscription : février 2004 Messages : 16 721 ![]() |
En fait, l'instruction join de Linq correspond à une équijointure. Le code SQL que tu montres réalise une jointure cartésienne et filtre les résultats ensuite. Pour faire l'équivalent avec Linq, il faut faire quelque chose comme ça :
Code :
__________________
Pas de questions techniques par MP ! Le forum est là pour ça... |
||
|
00
|
|
|
#10 |
|
Membre éclairé
![]() Développeur Sharepoint/Biztalk Inscription : octobre 2008 Messages : 501 ![]() |
Parfait, c'est ce que je cherchais =)
Merci beaucoup |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com