2010-05-19 8 views
1

J'ai une base de données Access 2007 où j'ai deux tables, exp_cash et exp_cheque. Les deux sont liés à exp_cat, où exp_cat contient la liste des catégories, et exp_cash et exp_cheque contiennent id, cat_id, exp_date, exp_amount et exp_note.Accès MS refusant de combiner deux tables?

Lorsque j'ai essayé de les combiner, rien n'apparaît dans le résultat sauf si je supprime le nom_cat de ma requête. J'ai utilisé une simple requête:

SELECT DISTINCT 
    exp_cat.cat_name, 
    exp_cash.exp_amount, 
    exp_cheque.exp_amount 
FROM (exp_cat INNER JOIN exp_cash 
    ON exp_cat.ID = exp_cash.exp_cat_id) 
    INNER JOIN exp_cheque 
    ON exp_cat.ID = exp_cheque.exp_cat_id; 

Table exp_cat contient

exp_cat_name 
exp_cat_id 

    exp_cat_id ----- exp_cat_name 
     1  ----- Salary 
     2  ----- Electricity 
     3  ----- Water Bill 
     4  ----- Loan 

Table exp_cash contient

exp_cash_id 
exp_date 
exp_cat_id 
exp_cash_amount 
exp_invoice_no 
    exp_cash_id ----- exp_date ---- exp_cat_id ---- exp_cash_amount ---- exp_invoice_no 
     1  ----- 15/05/2010 -- 2  ---- 200   ---- 25AB5245 
     2  ----- 17/05/2010 -- 1  ---- 50    ---- 58624AA 

Table exp_cheue contient

exp_cheque_id 
exp_date 
exp_cat_id 
exp_cheque_amount 
exp_invoice_no 

    exp_cheque_id ----- exp_date ---- exp_cat_id -- exp_cheque_amount -- exp_invoice_no 
     1  ----- 15/05/2010 -- 3   -- 120    -- 25AB5245 
     2  ----- 17/05/2010 -- 4   -- 500    -- 58624AA 
+3

Un peu clair ce que vous voulez. Peut-être quelques exemples de données de chaque table, et un exemple de ce que vous souhaitez en sortie? – John

+0

hey là désolé c'était mon erreur merci pour la note – Mahmoud

+0

Utilisez-vous la fenêtre de conception de requête? Avez-vous des exemples de données, comme John l'a demandé? Juste quelques lignes de chaque table devraient suffire. – Fionnuala

Répondre

2

Je pense que ce que vous voulez est laissé rejoint à la place des jointures internes:

SELECT exp_cat.exp_cat_name, 
     exp_cheque.exp_cash_amount, 
     exp_cash.exp_cheque_amount 
FROM (exp_cat LEFT JOIN exp_cash 
     ON exp_cat.exp_cat_id = exp_cash.exp_cat_id) 
    LEFT JOIN exp_cheque 
     ON exp_cat.exp_cat_id = exp_cheque.exp_cat_id; 

Sinon, vous devez avoir le même exp_cat_id dans les tables exp_cash et exp_cheque. Les jointures internes montrent uniquement ce qui existe dans les deux tables. La jointure à gauche montre tout dans la table de gauche, et tout ce qui arrive à correspondre dans la table de droite (ou des valeurs nulles si rien ne correspond).

Voici ce que je reçois quand je lance cette requête avec vos données:

exp_cat_name exp_cash_amount exp_cheque_amount 
------------ --------------- ----------------- 
Salary       50 
Electricity      200 
Water Bill  120 
Loan   500 
0

Je vous conseille vivement de réfléchir à la mise en œuvre d'une généralisation dans votre modèle de base de données. Cela vous permettra de fusionner les deux tables 'exp_cash' et 'exp_cheque'. Vous pouvez par exemple ajouter un champ tel que 'exp_type' dans une table 'exp'. En ajoutant un autre champ à suivre si l'opération est une dépense ou un revenu, vous pouvez même avoir une table plus générique que nous pourrions appeler "ope" (c'est-à-dire "dépenses et recettes") avec les champs suivants :

  • ope_id
  • ope_status (soit "exp" ou "rev")
  • ope_type (espèces, chèque, mais aussi virement bancaire, etc.)
  • ope_amount (vous pouvez choisir d'avoir des effets positifs FRO chiffre d'affaires/négatif pour les dépenses)
  • ope_date
  • ...

De cette façon, vous serez en mesure de calculer les soldes (par type, période, etc.) sans en faire un cauchemar!

une théorie sur la généralisation de la base de données here