OVH Cloud OVH Cloud

Imbriquer des outer join

3 réponses
Avatar
Dirkpitt
Bonjour a tous,

J'ai un souci de gestion des outer join dans SQL Server.
J'ai une requete du type :

....
FROM
a -- mvt de stock (par periode comptable)
LEFT OUTER JOIN g -- conditionnements possibles
ON g = a
INNER JOIN h -- articles
ON h = a
INNER JOIN e -- periode comptable (=> date debut/fin)
ON a = e
LEFT OUTER JOIN y -- reference vendable
LEFT OUTER JOIN z -- detail de facture
INNER JOIN w -- entete de facture
LEFT OUTER JOIN r -- avoir
ON
w = r
INNER JOIN v -- code livraison
INNER JOIN u -- adress
INNER JOIN t --pays
ON u = t
ON v = u
ON w = v
INNER JOIN s -- code facturation
ON s = w
ON z = w AND
w between e.debut and e.fin
ON y = z
ON y = a,
en_item_ext b
WHERE
.....

Mon probleme vient de la ligne w between e.debut and e.fin car a cet
endroit, a n'a pas l'air d'etre connu. Or je pensais benoitement que le
contexte passait d'un outer join a un autre. Ca n'a pas l'air.

Pouvez vous m'aider ?

Je vous remercie grandement

3 réponses

Avatar
bruno reiter [MVP]
pour etre lisible et efficace, il est bon de séparer les clauses de
jointures (liées au join lui meme),des clauses de selection.
soit

SELECT cols...
FROM T1
JOIN T2
ON x = y
AND a = b
JOIN T3
ON e = f
WHERE r = t
AND z BETWEEN q AND u


br

"Dirkpitt" wrote in message
news:42d4c738$0$5159$
Bonjour a tous,

J'ai un souci de gestion des outer join dans SQL Server.
J'ai une requete du type :

....
FROM
a -- mvt de stock (par periode comptable)
LEFT OUTER JOIN g -- conditionnements possibles
ON g = a
INNER JOIN h -- articles
ON h = a
INNER JOIN e -- periode comptable (=> date debut/fin)
ON a = e
LEFT OUTER JOIN y -- reference vendable
LEFT OUTER JOIN z -- detail de facture
INNER JOIN w -- entete de facture
LEFT OUTER JOIN r -- avoir
ON
w = r
INNER JOIN v -- code livraison
INNER JOIN u -- adress
INNER JOIN t --pays
ON u = t
ON v = u
ON w = v
INNER JOIN s -- code facturation
ON s = w
ON z = w AND
w between e.debut and e.fin
ON y = z
ON y = a,
en_item_ext b
WHERE
.....

Mon probleme vient de la ligne w between e.debut and e.fin car a cet
endroit, a n'a pas l'air d'etre connu. Or je pensais benoitement que le
contexte passait d'un outer join a un autre. Ca n'a pas l'air.

Pouvez vous m'aider ?

Je vous remercie grandement


Avatar
Patrice
La syntaxe ne me parait pas bonne. Tu as des jointures sans clause ON et
plusieurs clauses ON de suite ??
--
Patrice

"Dirkpitt" a écrit dans le message de
news:42d4c738$0$5159$
Bonjour a tous,

J'ai un souci de gestion des outer join dans SQL Server.
J'ai une requete du type :

....
FROM
a -- mvt de stock (par periode comptable)
LEFT OUTER JOIN g -- conditionnements possibles
ON g = a
INNER JOIN h -- articles
ON h = a
INNER JOIN e -- periode comptable (=> date debut/fin)
ON a = e
LEFT OUTER JOIN y -- reference vendable
LEFT OUTER JOIN z -- detail de facture
INNER JOIN w -- entete de facture
LEFT OUTER JOIN r -- avoir
ON
w = r
INNER JOIN v -- code livraison
INNER JOIN u -- adress
INNER JOIN t --pays
ON u = t
ON v = u
ON w = v
INNER JOIN s -- code facturation
ON s = w
ON z = w AND
w between e.debut and e.fin
ON y = z
ON y = a,
en_item_ext b
WHERE
.....

Mon probleme vient de la ligne w between e.debut and e.fin car a cet
endroit, a n'a pas l'air d'etre connu. Or je pensais benoitement que le
contexte passait d'un outer join a un autre. Ca n'a pas l'air.

Pouvez vous m'aider ?

Je vous remercie grandement


Avatar
Fred BROUARD
La clause FROM est un arborescence et les prédicats ON se voient plus calirement
attachés à chaque table.
Dès que l'on démarrare une jointure externe, il est habituel que toutes les
tables qui en dépendent soit en jointure externes.

Si ce que tu veut, c'est tous les mouvements de stock, alors :

FROM A
LEFT OUTER JOIN g ON a.??? = g.??? -- !!!
erreur probable : inversion de la jointure
INNER JOIN h ON a.??? = h.???
INNER JOIN e ON a.??. = e.???
LEFT OUTER JOIN y ON a.??? = y.??? -- !!!
erreur probable : inversion de la jointure
LEFT OUTER JOIN z ON y.??? = z.???
LEFT OUTER JOIN w ON z.??? = w.??? -- !!!
erreur probable : pas d'INNER JOIN derrière une jointure OUTER
AND w between e.debut and e.fin
LEFT OUTER JOIN r ON w.??? = r.???
LEFT OUTER JOIN s ON w.??? = s.??? -- !!!
erreur probable : pas d'INNER JOIN derrière une jointure OUTER
LEFT OUTER JOIN v ON w.??? = v.??? -- !!!
erreur probable : pas d'INNER JOIN derrière une jointure OUTER
LEFT OUTER JOIN u ON v.??? = u.??? -- !!!
erreur probable : pas d'INNER JOIN derrière une jointure OUTER
LEFT OUTER JOIN t ON u.??? = t.??? -- !!!
erreur probable : pas d'INNER JOIN derrière une jointure OUTER

WHERE ...


A lire :
http://sqlpro.developpez.com/cours/sqlaz/jointures/#L4.2

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste 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
************************ www.datasapiens.com *************************


Dirkpitt a écrit:
Bonjour a tous,

J'ai un souci de gestion des outer join dans SQL Server.
J'ai une requete du type :

....
FROM
a -- mvt de stock (par periode comptable)
LEFT OUTER JOIN g -- conditionnements possibles
ON g = a
INNER JOIN h -- articles
ON h = a
INNER JOIN e -- periode comptable (=> date debut/fin)
ON a = e
LEFT OUTER JOIN y -- reference vendable
LEFT OUTER JOIN z -- detail de facture
INNER JOIN w -- entete de facture
LEFT OUTER JOIN r -- avoir
ON
w = r
INNER JOIN v -- code livraison
INNER JOIN u -- adress
INNER JOIN t --pays
ON u = t
ON v = u
ON w = v
INNER JOIN s -- code facturation
ON s = w
ON z = w AND
w between e.debut and e.fin
ON y = z
ON y = a,
en_item_ext b
WHERE
.....

Mon probleme vient de la ligne w between e.debut and e.fin car a cet
endroit, a n'a pas l'air d'etre connu. Or je pensais benoitement que le
contexte passait d'un outer join a un autre. Ca n'a pas l'air.

Pouvez vous m'aider ?

Je vous remercie grandement