Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1426 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2198712
hush hush
je savais que ça te plairait
Posté le 25-07-2013 à 11:32:05  profilanswer
 

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
mood
Publicité
Posté le 25-07-2013 à 11:32:05  profilanswer
 

n°2198739
poulpeleac​h
Octopus paradisi
Posté le 25-07-2013 à 14:34:21  profilanswer
 

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
n°2198742
hush hush
je savais que ça te plairait
Posté le 25-07-2013 à 14:41:20  profilanswer
 

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

n°2198743
poulpeleac​h
Octopus paradisi
Posté le 25-07-2013 à 14:44:08  profilanswer
 

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
n°2198746
hush hush
je savais que ça te plairait
Posté le 25-07-2013 à 14:50:13  profilanswer
 

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
n°2198757
hush hush
je savais que ça te plairait
Posté le 25-07-2013 à 15:38:44  profilanswer
 

[: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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
Extraction d'instructions SQLRequête UPDATE aucun résultat
calcul de cout d'une requetecreationd'une requete avec hibernate
Bd Access, champs liés à la source Excel avec VBASQL / creer des colonnes dont les valeurs sont conditionnelles
[MySQL] - Requête SQL sur plusieurs tablestri-fusion, jointure par hachage et boucles imbriquées
Unifier la collation des colonnes d'une bdd MS SQL Server par script 
Plus de sujets relatifs à : [SQL/ACCESS] Requête Jointure + imbrication?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR