SQL et Jointure

26-01-2007 à 19:08:46
Salut, je sais plus ou j en suis ...cherche une solution a ajouter a ma jointure pour finaliser cet sql (voir ci-dessous) et passer a autres choses.
Si pas de reponses ben va falloir que je fasse autrement..

le fameux sql: si dans la table aliasreferencetype (droite) j ai 2 records pour la table trading_partner (gauche) , je retrouve dans le resultat de ma requete 2 lignes ayant le meme trading_partner_ID ...
je souhaiterai ne prendre que le 1er record de la table aliasreferencetype pour chaque record de la table trading_partner en jointure...(par left join)
MARCI!


SELECT
cast(OATSTDB.OA_GET_CMNT_FLAG('COTRDPTP',T1.Trading_Partner_ID) as

char(1)) as Comment_Flag,
T1.Trading_Partner_ID,

T1.TradingPartnerNumber,
T1.Party_Role,
T1.Name,

cast(OATSTDB.OA_GET_CODE_VALUE(T1.StatusCodeID) as char(5)) as Status_Code,

T2.ReferenceTypeCode as Alias_Type,
case
when t2.referencetablename = 'NATIONAL_VENDOR_REFERENCE'
then(select Dec(t3.National_Vendor_Number,10,0)
from OATSTDB.National_Vendor_reference t3
where t3.trading_Partner_ID = t1.Trading_partner_ID)
when t2.referencetablename = 'ACCOUNTING_VENDOR_REFERENCE'
then(select dec(digits(t4.ap_Vendor_Number) || digits(t4.ap_vendor_suffix),10,0)
from OATSTDB.accounting_vendor_reference t4
where t4.trading_Partner_ID = t1.Trading_partner_ID)
when t2.referencetablename = 'BUY_VENDOR_REFERENCE'
then(select dec(digits(t5.buy_Vendor_Number) || digits(t5.buy_vendor_suffix),10,0 )
from OATSTDB.buy_Vendor_Reference t5

where t5.trading_Partner_ID = t1.Trading_partner_ID)
end as alias_number ,
case
when (select count(*) from OATSTDB.aliasreferencetype t6 where t6.trading_partner_ID = t1.trading_partner_ID) > 1
then 'Y'
else 'N'
end as alias_multiple
FROM OATSTDB.trading_partner t1

left join
OATSTDB.Aliasreferencetype T2
on
t1.Trading_Partner_ID = T2.Trading_Partner_ID
  • Liens sponsorisés



25-01-2007 à 10:33:16
Si j'ai bien compris, il s'agit de sélectionner que la 1ère relation trouvée dans le fichier de droite.
La requête suivante permet de récupérer tous les enregitrement de FICA ainsi que la 1ère relation (la plus récente) trouvée dans FICB.

SELECT * FROM FICA A
LEFT OUTER JOIN FICB B ON
(A.CODE = B.CODE)
WHERE RRN( B )
IN(SELECT MAX(RRN(C)) FROM FICB C
WHERE B.CODE = C.CODE)

--Message édité par Serge le 25-01-07 à 10:34:08--

--Message édité par Serge le 25-01-07 à 10:34:57--
25-01-2007 à 16:05:35
Merci Serge, ton aide est tres appreciee, j'ai adatpe ton SQL a ma requete pi ...je n obtenais que ce qui etait en egalite (gauche droite mais bien avec 1 seul de droite, j ai donc chercher un peu plus et trouve le sql
suivant qui fait bien le left join en ne prenant que le premier de droite.
Cool merci et encore merci.

SELECT t1.trading_partner_id , PARTY_ROLE, NAME,
t2.referencetypecode, t2.referencetablename , t2.referencetypeid
FROM trading_partner t1 left join
aliasreferencetype t2
on t1.trading_partner_ID = t2.trading_partner_ID
and (rrn(t2) = (SELECT max(RRN(t3)) FROM aliasreferencetype t3
WHERE t2.trading_partner_ID = t3.trading_Partner_ID) )

j ai juste deplacer la condition au niveau du on au lieu de la mettre au niveau du where

MARCI du Canada

Jean
25-01-2007 à 16:20:33
Un tuyau au passage.

Etablir les conditions de jonction dans la clause WHERE relève d'une ancienne méthode. De nos jours, il est préférable pour des raisons de performance essentiellement (nouveau moteur SQL) mais aussi de lisibilité d'établir les jonctions de tables avec les clauses JOIN plutôt que dans le prédicat WHERE.
26-01-2007 à 08:36:31
Merci pour le tuyau ;)
26-01-2007 à 19:08:46
Merci a tous encore, j'ai appris aussi qu'avec le MAX j'obtenais le dernier doublons tandis qu'avec le min le permier cool.

  • Liens sponsorisés