Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur de Jointure entre deux tables

2 réponses
Avatar
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

2 réponses

Avatar
Michel__D
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;
Avatar
zoltix
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 wrote:
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