[SQL/ACCESS] Requête Jointure + imbrication?

Requête Jointure + imbrication? [SQL/ACCESS] - SQL/NoSQL - Programmation

Marsh Posté le 25-07-2013 à 11:32:05    

Bonjour à tous :)
Je bosse sur une requête qui me permettra de "maintenir" une bdd sous access.
La base de donnée contient les calculs effectués sur des produits.
Les calculs sont effectués selon un calendrier bien précis. Le process de calculs est indépendant de la base, au détail prêt que les résultats y sont stockés.
Grosso modo, chaque jour du calendrier spécifique, un calcul est effectué sur tous les produits et est stocké dans la base. Lorsque tout se passe bien, le calcul est effectué le jour même. Parfois, ça peut merder et le calcul peut ne pas être fait. Il reste possible de le faire à posteriori.
La requête que je souhaite créer à pour objectif d'identifier les dates et les produits pour lesquels les calculs n'ont pas été faits. Sachant que pour un même jour, le calcul peut avoir été fait pour tout ou partie des produits.
Le problème revient donc à identifier des "trous" dans une base de données à partir :
-d'une liste de produits
-d'une liste de dates du calendrier spécifique
 
En gros, voici les tables dont je dispose:
TableProduits:
-id (clé primaire, numéro auto)
-Spec1
-Spec2
....
 
TableCalculs:
-id (clé primaire, numéro auto)
-id_Produit
-Date_Calcul
 
CalendrierS
-id (clé primaire, numéro auto)
-DateC
 
Les tables Produit et Calculs sont liées (imbrication) via TableProduits.id et TableCalculs.id_Produit
 
J'ai monté une première requête sur une base épurée: 1 seul produit en base dans la table produits et uniquement les calculs effectués sur ce produits.
La requête suivante me permet de récupérer toutes les dates contenues dans le calendrierS et qui n'existent pas dans la table calculs (donc, pour ce produit, toutes les dates où le calcul n'a pas été fait):

Citation :

SELECT *
FROM CalendrierS LEFT JOIN TableCalculs ON CalendrierS.DateC = TableCalculs.[Date_Calcul]
WHERE (((TableCalculs.[Date_Calcul]) Is NUll));


Cette requête fonctionne, (bon, le * de Select peut être limité à la date) et me retourne mes résultats.
Si je l'essaye sur ma base complète, elle me ressort bien moins de trou, j'ai l'impression que dès qu'un produit à été l'objet d'un calcul, quelqu'il soit, elle considère que tout les produits ont été calculés.
 
A votre avis, quelle piste je devrais suivre pour pondre 1 requête qui me sorte une table du genre:
-id_produit
-date
Avec donc, pour chaque produit, la liste des dates où ils n'ont pas été calculés
J'éspère que j'ai été clair :o n'hésitez pas à me demander plus de détails :o
:jap:


Message édité par hush hush le 25-07-2013 à 11:34:37
Reply

Marsh Posté le 25-07-2013 à 11:32:05   

Reply

Marsh Posté le 25-07-2013 à 14:34:21    

Le résultat obtenu est parfaitement logique vu que la jointure externe + le test null va enlever de CalendrierS  toutes les dates pour lesquelles on trouve une occurence dans TableCalculs .

 

Donc, moi je ferai ca :

 

select a.DateC, a.id_Produit
from (
select distinct DateC , id_Produit
from CalendrierS , TableCalculs
) a left outer join TableCalculs b on a.id_Produit=b.id_Produit and a.DateC=b.Date_Calcul
where b.Date_Calcul is null

 

La requete imbriquee te sort toutes les combinatoirs Produit*Date (avec un joli produit cartésien), la jointure externe avec TableCalcul évacue tous les cas où y a déjà eu un calcul.


Message édité par poulpeleach le 25-07-2013 à 14:35:16
Reply

Marsh Posté le 25-07-2013 à 14:41:20    

Euh... c'est quoi a et b?
 :ange:

Reply

Marsh Posté le 25-07-2013 à 14:44:08    

hush hush a écrit :

Euh... c'est quoi a et b?
 :ange:


 
Des alias.
Ca marche sous Access je crois?


Message édité par poulpeleach le 25-07-2013 à 14:44:30
Reply

Marsh Posté le 25-07-2013 à 14:50:13    

Je check google et je te dis ça... mais j'ai à peu près compris le principe...
En gros:
-Une sous requête me pond le produit cartesien des dates de mon calendrier spécifique par les id produits (si j'ai 100 produits, j'aurais 100 fois les dates de mon calendrier spécifique)
-Je cross check sur les 2 champs avec ma table de calculs...
Je creuse et reviens dire ce qu'il en est :o
Edit: ouais ça a l'air d'exister :)


Message édité par hush hush le 25-07-2013 à 14:53:52
Reply

Marsh Posté le 25-07-2013 à 15:38:44    

[:cerveau shay]  
ça marche!
Ainsi:
 

Citation :

SELECT *
FROM (SELECT CalendrierS.dateC, TableProduits.id FROM CalendrierS, TableProduits)  AS [PC]  'Motherfucking Produit Cartésien!
LEFT JOIN fixings ON ([PC].[id_Produit] = Calculs.[id_Produits]) AND ([PC].[DateCalcul]=CalendrierS.[dateC])
WHERE (((Calculs.[dateCalcul]) Is Null));


 
On est vraiment pas mal sur les perfs :o
ça fait plaiz!
Merci beaucoup pour le coup de main!!


Message édité par hush hush le 25-07-2013 à 15:39:37
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed