Erreur de Jointure entre deux tables

Le
kanak09
Bonjour,
J'ai un soucis de jointure entre deux tables .
J'ai une 1ere requête qui me donne une table du type :

ex :
OutilId - Lien1 - Lien2
123 - 1200 - null
124 - 1201 - 1202

rq : un outil peut avoir 1 ou 2 lien , si il n'a qu'un lien le 2e est marqué à null



Voici la requete

SELECT OutilId, max(case nb when 1 then LienId end) AS Lien1, max(case nb when 2 then LienId end) AS Lien2 , Chemin as Chem1, Chemin as Chem2
FROM ( SELECT mt1.OutilId, mt1.LienId,
count(*) AS nb
FROM ASSOCIE AS mt1
INNER JOIN ASSOCIE AS mt2
ON mt2.OutilId = mt1.OutilId AND mt2.LienId <= mt1.LienId
GROUP BY mt1.OutilId, mt1.LienId
) AS SR

GROUP BY OutilId
) as Tb1 , Lien


Ensuite j'ai une table existante dans ma base qui associe à chaque Lien un Chemin

Ex :

IdLien - Chemin
1200 - c:test





Ce que je souhaite c'est d'obtenir une table contenant

Outild - Chemin1 ( correspondant au Lien1 ) - Chemin2 ( correspondant au Lien2 )
124 - c:test. - c:test2




Voici la requete que je test mais qui me renvoie une erreur

Server: Msg 107, Level 16, State 1, Line 1
Le préfixe de colonne 'Tb1' ne correspond ni au nom de table ni au nom d'alias utilisés dans la requête.





SELECT Tb1.OutilId, Tb1.Lien1, Tb1.Lien2, L1.Chemin Chemin1, L2.Chemin Chemin2
FROM (
SELECT OutilId, max(case nb when 1 then LienId end) AS Lien1, max(case nb when 2 then LienId end) AS Lien2 , Chemin as Chem1, Chemin as Chem2
FROM ( SELECT mt1.OutilId, mt1.LienId,
count(*) AS nb
FROM ASSOCIE AS mt1
INNER JOIN ASSOCIE AS mt2
ON mt2.OutilId = mt1.OutilId AND mt2.LienId <= mt1.LienId
GROUP BY mt1.OutilId, mt1.LienId
) AS SR

GROUP BY OutilId
) as Tb1 , Lien
INNER JOIN Lien L1 ON L1.IDLien = Tb1.Lien1
LEFT JOIN Lien L2 ON L2.IDLien = Tb1.Lien2



Je vous remercie beaucoup
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michel__D
Le #22356281
Bonjour,

kanak09 a écrit :
Bonjour,
J'ai un soucis de jointure entre deux tables .
J'ai une 1ere requête qui me donne une table du type :

ex :
OutilId - Lien1 - Lien2
123 - 1200 - null
124 - 1201 - 1202

rq : un outil peut avoir 1 ou 2 lien , si il n'a qu'un lien le 2e est marqué à
null



Voici la requete

SELECT OutilId, max(case nb when 1 then LienId end) AS Lien1, max(case nb when
2 then LienId end) AS Lien2 , Chemin as Chem1, Chemin as Chem2
FROM ( SELECT mt1.OutilId, mt1.LienId,
count(*) AS nb
FROM ASSOCIE AS mt1
INNER JOIN ASSOCIE AS mt2
ON mt2.OutilId = mt1.OutilId AND mt2.LienId <= mt1.LienId
GROUP BY mt1.OutilId, mt1.LienId
) AS SR

GROUP BY OutilId
) as Tb1 , Lien


Ensuite j'ai une table existante dans ma base qui associe à chaque Lien un
Chemin

Ex :

IdLien - Chemin
1200 - c:test...





Ce que je souhaite c'est d'obtenir une table contenant

Outild - Chemin1 ( correspondant au Lien1 ) - Chemin2 ( correspondant au Lien2
)
124 - c:test.... - c:test2...




Voici la requete que je test mais qui me renvoie une erreur

Server: Msg 107, Level 16, State 1, Line 1
Le préfixe de colonne 'Tb1' ne correspond ni au nom de table ni au nom d'alias
utilisés dans la requête.





SELECT Tb1.OutilId, Tb1.Lien1, Tb1.Lien2, L1.Chemin Chemin1, L2.Chemin Chemin2
FROM (
SELECT OutilId, max(case nb when 1 then LienId end) AS Lien1, max(case nb
when 2 then LienId end) AS Lien2 , Chemin as Chem1, Chemin as Chem2
FROM ( SELECT mt1.OutilId, mt1.LienId,
count(*) AS nb
FROM ASSOCIE AS mt1
INNER JOIN ASSOCIE AS mt2
ON mt2.OutilId = mt1.OutilId AND mt2.LienId <= mt1.LienId
GROUP BY mt1.OutilId, mt1.LienId
) AS SR

GROUP BY OutilId
) as Tb1 , Lien
INNER JOIN Lien L1 ON L1.IDLien = Tb1.Lien1
LEFT JOIN Lien L2 ON L2.IDLien = Tb1.Lien2



Je vous remercie beaucoup



Essaye avec ceci (à adapter) :

TRANSFORM First(T.Chemin) AS Valeur
SELECT R.OutilId
FROM [SELECT A.OutilId, A.LienId, Count(*) AS NbLien
FROM ASSOCIE AS A INNER JOIN ASSOCIE AS B
ON A.OutilId=B.OutilId And A.LienId<=B.LienId
GROUP BY A.OutilId, A.LienId]. AS R INNER JOIN LaTableChemin AS T ON R.LienId=T.IdLien
GROUP BY R.OutilId
PIVOT "Chemin" & R.NbLien;
zoltix
Le #22440351
Je n'aime pas trop ta requête car c'est un peu récursif alors je te
conseil d'utiliser les With CTE.
Je ne vais pas l'écrire pour toi mais n'hésite pas a poster des
messages si tu as des soucis.

va voir

http://sqlpro.developpez.com/cours/sqlserver/cte-recursives/

http://msdn.microsoft.com/en-us/library/ms175972.aspx

Mais il y a aussi les Pivot table le code "Michel__D" ressemble très
for a une query access et non sql server a cause du "transform".

A+




.....

On 8 juil, 17:35, kanak09
Bonjour,
J'ai un soucis de jointure entre deux tables .
J'ai une 1ere requête qui me donne une table du type :

ex :
OutilId  -  Lien1 - Lien2
   123  -  1200 - null
    124  -  1201  - 1202

rq : un outil peut avoir 1 ou 2 lien , si il n'a qu'un lien le 2e est mar qué à
null

Voici la requete

SELECT OutilId, max(case nb when 1 then LienId end) AS Lien1, max(case nb when
2 then LienId end) AS Lien2 , Chemin as Chem1, Chemin as Chem2
                FROM (  SELECT mt1.OutilId, mt1.LienId,
                                 count( *) AS nb
                        FROM ASSOCIE AS mt1
                        INNER JOIN ASSOCIE AS mt2
                        ON mt2.OutilId = mt1.Ou tilId AND mt2.LienId   <= mt1.LienId
                        GROUP BY mt1.OutilId, mt1 .LienId
                      ) AS SR

                GROUP BY OutilId
       ) as Tb1 , Lien

Ensuite j'ai une table existante dans ma base qui associe à chaque Lien un
Chemin

Ex :

IdLien  -  Chemin
 1200 - c:test...

Ce que je souhaite c'est d'obtenir une table contenant

Outild - Chemin1 ( correspondant au Lien1 )  - Chemin2 ( correspondant au Lien2
)
 124    -     c:test....                                  -     c:test2...

Voici la requete que je test mais qui me renvoie une erreur

Server: Msg 107, Level 16, State 1, Line 1
Le préfixe de colonne 'Tb1' ne correspond ni au nom de table ni au nom d'alias
utilisés dans la requête.

SELECT Tb1.OutilId, Tb1.Lien1, Tb1.Lien2, L1.Chemin Chemin1, L2.Chemin Ch emin2
FROM (
                SELECT OutilId, max(case nb when 1 then L ienId end) AS Lien1, max(case nb
when 2 then LienId end) AS Lien2 , Chemin as Chem1, Chemin as Chem2
                FROM (  SELECT mt1.OutilId, mt1.LienId,
                                 count( *) AS nb
                        FROM ASSOCIE AS mt1
                        INNER JOIN ASSOCIE AS mt2
                        ON mt2.OutilId = mt1.Ou tilId AND mt2.LienId   <= mt1.LienId
                        GROUP BY mt1.OutilId, mt1 .LienId
                      ) AS SR

                GROUP BY OutilId
       ) as Tb1 , Lien
INNER JOIN Lien L1 ON L1.IDLien = Tb1.Lien1
LEFT JOIN Lien L2 ON L2.IDLien = Tb1.Lien2

Je vous remercie beaucoup
Publicité
Poster une réponse
Anonyme