Bonjour,

J'ai une base de données ressemblant à ceci :
Nom : help.PNG
Affichages : 154
Taille : 47,1 Ko

PRODUCTS est une liste de produits. Un Lot (PRODUCTS.FAMILY = 1) contient d'autre produits.
Ces relations sont stockées dans PROD_PROD avec K_PRODUCT = clé du lot et K_PRODUCT2 = clé du produit :
Lot 1 contient :
  • Prestation 1
  • Prestation 2
  • Prestation 3

Lot 2 contient :
  • Prestation 1
  • Prestation 3


Les produits peuvent être liés à un Document (cf DOCU_PROD). J'ai mis 2 versions de cette table dans l'exemple avec chacune le résultat attendu.
Avec "DOCU_PROD v1", le Document 380 contient :
- Lot 1
- Prestation 1
- Prestation 2
- Prestation 3
- Aléas

Un produits peut appartenir plusieurs Lot. Je souhaite pour chaque Document, retrouver la liste de tous les produits qu'il contient SAUF les lots. Le lot doit être retrouvé en face de chacun des produits.
==> Si un produit appartient a plusieurs Lots, il doit être visible une fois par lot étant sur le document
==> Un produit peut être lié a un Document sans appartenir a un Lot (cf "Aléas")

Exemple avec "DOCU_PROD v1" :
Même si "Prestation 1" et "Prestation 3" sont contenus dans "Lot 1" et "Lot 2", les résultats ne les présentent qu'une fois chacun (en provenance de "Lot 1") car "Lot 1" est lié au Document mais pas "Lot 2"

Je suis arrivé à mettre en place cette requête, mais je n'arrive pas a join DOCU_PROD pour l'utiliser dans le select :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
select Batch.K_PRODUCT as K_BATCH, Batch.NAME as BATCHNAME, Prod.K_PRODUCT, Prod.NAME
	from Provademse.ADMINPROVADEMSE.PRODUCTS Prod
	left join Provademse.ADMINPROVADEMSE.PROD_PROD PP on PP.K_PRODUCT2=Prod.K_PRODUCT
	left join Provademse.ADMINPROVADEMSE.PRODUCTS Batch on PP.K_PRODUCT=Batch.K_PRODUCT
		where Batch.K_PRODUCT in(select DP.K_PRODUCT from Provademse.ADMINPROVADEMSE.DOCU_PROD DP where DP.K_DOCUMENT=@Docu) or Batch.K_PRODUCT is null
		and Prod.FAMILY <> 1  /* Pas les Lots */

J'ai essayer avec cette requête, mais "Prestation 1" et "Prestation 2" apparaissent une fois pour "Lot 1" (normal) et une fois pour "Lot 2" (erreur...):
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
select Batch.K_PRODUCT as K_BATCH, Batch.NAME as BATCHNAME, Prod.NAME, DP.* /* pas besoin de Prod.K_PRODUCT car présent dans DP.*
	from Provademse.ADMINPROVADEMSE.DOCU_PROD DP /* tous les produits lié a un document */
	join Provademse.ADMINPROVADEMSE.PRODUCTS Prod on (DP.K_PRODUCT=Prod.K_PRODUCT and Prod.FAMILY <> 1) /* tous les produits sauf les Lots */
	left join Provademse.ADMINPROVADEMSE.PROD_PROD PP on PP.K_PRODUCT2=Prod.K_PRODUCT /* left join car aussi les produits non contenu dans un lot */
	left join Provademse.ADMINPROVADEMSE.PRODUCTS Batch on PP.K_PRODUCT=Batch.K_PRODUCT /* left join car aussi les produits non contenu dans un lot */
	where DP.K_DOCUMENT=830 /* filtrer sur DOCUMENT 380 */
	order by Batch.K_PRODUCT

Merci d'avance pour votre aide !

2 lignes en trop (en orange) :
Nom : Capture.PNG
Affichages : 144
Taille : 12,2 Ko



Les "left join" sont nécessaires car il permettent de récupérer les produits sans Lot (Aléas)