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

Problème avec les jointures externes

6 réponses
Avatar
KOUASSI Yao-Koffi
Salut !
Je suis en train de migrer une application de Centura=20
SQLBase 7.5.1 sous SQL Server et je recontre quelques=20
probl=E8mes avec les jointures externes. Avec SQLBase de=20
Centura, il est possible de faire une jointure externe=20
entre une colonne et une variable. Cette fonctionnalit=E9=20
n'est pas pr=E9sente sous SQL Server o=F9 la jointure externe=20
est effectu=E9e entre deux colonnes. Comment puis-je=20
r=E9soudre ce probl=E8me.
Merci d'avance pour toute vos remarques et suggestions

6 réponses

Avatar
Fred BROUARD
Donnez un exemple précis, car je ne voit ni l'utilité de ce type de
jointure sauf à ce qu'elle complémente un lien entre deux tables...

A +

KOUASSI Yao-Koffi a écrit:
Salut !
Je suis en train de migrer une application de Centura
SQLBase 7.5.1 sous SQL Server et je recontre quelques
problèmes avec les jointures externes. Avec SQLBase de
Centura, il est possible de faire une jointure externe
entre une colonne et une variable. Cette fonctionnalité
n'est pas présente sous SQL Server où la jointure externe
est effectuée entre deux colonnes. Comment puis-je
résoudre ce problème.
Merci d'avance pour toute vos remarques et suggestions



--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
KOUASSI Yao-Koffi
Ok Fred !

Nous considérons donc les deux tables PARAMETRES et
REDEVANCECLIENT.


Table PARAMETRES
****************

Numero DateMaj Centre Code libelleCode
----------------------------------------------------
001 21-JAN-2000 000 000001 Pays
101 21-APR-2004 000 000001 Critère 1
101 21-APR-2004 000 000002 Critère 2
101 22-APR-2001 000 000003 Critère 3



Table REDEVANCECLIENT
*********************

CENTRE COMMUNE PRODUIT REDEVANCE CRITERE VARIANTE
------------------------------------------------------
000 00000 01 11 02 1
000 00000 01 11 03 2
011 00000 01 11 03 4
011 00000 01 11 04 4



Sous SQLBase, lorsque j'exécute la requête suivante :

SELECT COUNT(R.Variante), P.Code, P.LibelleCode FROM
RedevanceClient R, Parametres P WHERE R.Centre(+)='011'
AND R.Commune(+)='00000' AND R.Produit(+)='01' AND
R.Redevance(+)='11' AND (P.Centre='000' OR P.Centre =
R.Centre(+) ) AND P.Num1 AND R.Critere(+)= @RIGHT
(P.Code, 2) GROUP BY P.Code, P.Libelle

J'obtiens le résultat suivant :
COUNT(R.VARIANTE) P.CODE P.LIBELLE
-------------------------------------------------
0 000001 Critère 1
0 000002 Critère 2
0 000003 Critère 3


Il est primordial que je fasse ici quelques remarques :
1- Sous SQLBase, la jointure externe est faite par (+)
2- La colonne jointe reçoit le (+) c'est-à-dire que la
colonne qui est suceptible de ne pas fournir de résultat
3- La fonction @RIGHT possède comme équivalente sous SQL
Serve la fonction RIGHT


Si je devais trouver une équivalente de cette requête sous
SQL Server, ce serait :

SELECT COUNT(R.Variante), P.Code, P.LibelleCode FROM
RedevanceClient R, Parametres P WHERE R.Centre =* '011'
AND R.Commune =* '00000' AND R.Produit =* '01' AND
R.Redevance =* '11' AND (P.Centre='000' OR P.Centre *=
R.Centre) AND P.Num1 AND R.Critere =* RIGHT(P.Code, 2)
GROUP BY P.Code, P.Libelle
, mais le Hic est que la jointure externe sous SQL Server
concerne forcément deux colonnes, et c'est ça qui me
bloque.
Merci
Avatar
Fred BROUARD
L'équivalent en SQL normatif (à l'exception de la fonction RIGHT) et qui
doit tourner comme tu le souhaites sous SQL Server

SELECT COUNT(R.Variante), P.Code, P.LibelleCode
FROM RedevanceClient R
LEFT OUTER JOIN Parametres P
ON R.Critere = RIGHT(P.Code, 2)
AND R.Centre='011'
AND R.Commune='00000'
AND R.Produit='01'
AND R.Redevance='11'
AND (P.Centre='000' OR P.Centre = R.Centre )
AND P.Num1
GROUP BY P.Code, P.Libelle

A +

KOUASSI Yao-Koffi a écrit:
Ok Fred !

Nous considérons donc les deux tables PARAMETRES et
REDEVANCECLIENT.


Table PARAMETRES
****************

Numero DateMaj Centre Code libelleCode
----------------------------------------------------
001 21-JAN-2000 000 000001 Pays
101 21-APR-2004 000 000001 Critère 1
101 21-APR-2004 000 000002 Critère 2
101 22-APR-2001 000 000003 Critère 3



Table REDEVANCECLIENT
*********************

CENTRE COMMUNE PRODUIT REDEVANCE CRITERE VARIANTE
------------------------------------------------------
000 00000 01 11 02 1
000 00000 01 11 03 2
011 00000 01 11 03 4
011 00000 01 11 04 4



Sous SQLBase, lorsque j'exécute la requête suivante :

SELECT COUNT(R.Variante), P.Code, P.LibelleCode FROM
RedevanceClient R, Parametres P WHERE R.Centre(+)='011'
AND R.Commune(+)='00000' AND R.Produit(+)='01' AND
R.Redevance(+)='11' AND (P.Centre='000' OR P.Centre =
R.Centre(+) ) AND P.Num1 AND R.Critere(+)= @RIGHT
(P.Code, 2) GROUP BY P.Code, P.Libelle

J'obtiens le résultat suivant :
COUNT(R.VARIANTE) P.CODE P.LIBELLE
-------------------------------------------------
0 000001 Critère 1
0 000002 Critère 2
0 000003 Critère 3


Il est primordial que je fasse ici quelques remarques :
1- Sous SQLBase, la jointure externe est faite par (+)
2- La colonne jointe reçoit le (+) c'est-à-dire que la
colonne qui est suceptible de ne pas fournir de résultat
3- La fonction @RIGHT possède comme équivalente sous SQL
Serve la fonction RIGHT


Si je devais trouver une équivalente de cette requête sous
SQL Server, ce serait :

SELECT COUNT(R.Variante), P.Code, P.LibelleCode FROM
RedevanceClient R, Parametres P WHERE R.Centre =* '011'
AND R.Commune =* '00000' AND R.Produit =* '01' AND
R.Redevance =* '11' AND (P.Centre='000' OR P.Centre *=
R.Centre) AND P.Num1 AND R.Critere =* RIGHT(P.Code, 2)
GROUP BY P.Code, P.Libelle
, mais le Hic est que la jointure externe sous SQL Server
concerne forcément deux colonnes, et c'est ça qui me
bloque.
Merci



--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
KOUASSI Yao-Koffi
Requête testée avec succès !
Je viens de consulter MSDN qui préconise d'ailleurs
d'utiliser LEFT OUTER JOIN au lieu de =* (ou *=) pour
réaliser les jointures externes.
Merci beaucoup pour cette solution et bonne journée !
Avatar
Fred BROUARD
A lire :
http://sqlpro.developpez.com/SQL_AZ_3.html#JOIN_types

A +

KOUASSI Yao-Koffi a écrit:
Requête testée avec succès !
Je viens de consulter MSDN qui préconise d'ailleurs
d'utiliser LEFT OUTER JOIN au lieu de =* (ou *=) pour
réaliser les jointures externes.
Merci beaucoup pour cette solution et bonne journée !



--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
Fred BROUARD
A lire :
http://sqlpro.developpez.com/SQL_AZ_3.html#JOIN_types

A +

KOUASSI Yao-Koffi a écrit:
Requête testée avec succès !
Je viens de consulter MSDN qui préconise d'ailleurs
d'utiliser LEFT OUTER JOIN au lieu de =* (ou *=) pour
réaliser les jointures externes.
Merci beaucoup pour cette solution et bonne journée !



--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************