MS访问拒绝合并两个表?

时间:2010-05-19 17:45:51

标签: sql ms-access ms-access-2007

我有一个Access 2007数据库,其中有两个表,exp_cash和exp_cheque。两者都链接到exp_cat,其中exp_cat包含类别列表,exp_cash和exp_cheque包含id,cat_id,exp_date,exp_amount和exp_note。

当我尝试将它们组合时,除非我从查询中删除cat_name,否则结果中不会显示任何内容。我使用了一个简单的查询:

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;

表exp_cat包含

exp_cat_name
exp_cat_id

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

表exp_cash包含

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

表exp_cheue包含

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

2 个答案:

答案 0 :(得分:2)

我认为你想要的是左连接而不是内连接:

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;

否则,exp_cash和exp_cheque表中的exp_cat_id必须相同。 内部联接仅显示两个表中存在的内容。左连接显示左表中的所有内容,以及右手表中匹配的任何内容(如果没有匹配,则显示空值)。

以下是我使用您的数据运行查询时得到的结果:

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

答案 1 :(得分:0)

我强烈建议您考虑在数据库模型中实现泛化。它允许您合并'exp_cash'和'exp_cheque'表。例如,您可以在'exp'表中添加诸如'exp_type'之类的字段。 如果操作是费用或收入,通过添加另一个字段进行跟进,您甚至可以使用以下字段来创建一个更通用的表,我们称之为“ope”(它代表“费用和收入操作”):

  • ope_id
  • ope_status(“exp”或“rev”)
  • ope_type(现金,支票,还有银行汇款等)
  • ope_amount(您可以选择积极的收入/负费用)
  • ope_date
  • ...

通过这种方式,您可以计算余额(每种类型,期间等)而不会成为噩梦!

关于数据库概括的一些理论here