Sql MS access拒绝合并两个表?

Sql MS access拒绝合并两个表?,sql,ms-access,ms-access-2007,Sql,Ms Access,Ms Access 2007,我有一个Access 2007数据库,其中有两个表,exp\ U cash和exp\ U CHECK。两者都链接到exp_cat,其中exp_cat包含类别列表,exp_cash和exp_check包含id、cat_id、exp_日期、exp_金额和exp_注释 当我尝试组合它们时,结果中不会显示任何内容,除非我从查询中删除cat_名称。我使用了一个简单的查询: SELECT DISTINCT exp_cat.cat_name, exp_cash.exp_amount,

我有一个Access 2007数据库,其中有两个表,exp\ U cash和exp\ U CHECK。两者都链接到exp_cat,其中exp_cat包含类别列表,exp_cash和exp_check包含id、cat_id、exp_日期、exp_金额和exp_注释

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

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\U cat包含

exp_cat_name
exp_cat_id

    exp_cat_id ----- exp_cat_name
        1      -----    Salary
        2      -----    Electricity
        3      -----    Water Bill
        4      -----    Loan
表exp\U现金包含

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_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
表exp\u cheue包含

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_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

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

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_现金和exp_支票表中具有相同的exp_cat_id。 内部联接只显示两个表中存在的内容。左连接显示左表中的所有内容,以及右表中匹配的所有内容(如果没有匹配项,则显示空值)

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

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

我强烈建议您考虑在数据库模型中实现泛化。它将允许您合并“exp_现金”和“exp_支票”表。例如,您可以在“exp”表中添加一个字段,如“exp\u type”。 如果操作是费用或收入,则通过添加另一个字段进行后续操作,您甚至可以有一个更通用的表,我们可以将其称为“ope”(它代表“费用和收入操作”),其中包含以下字段:

  • 操作id
  • 操作状态(exp或rev)
  • 操作类型(现金、支票、银行转账等)
  • 营业金额(您可以选择收入为正/支出为负)
  • 开放日期
这样,您就可以计算余额(每种类型、每段时间等),而不会让它成为一场噩梦


关于数据库泛化的一些理论

有点不清楚您想要什么。可能是每个表中的一些示例数据,以及您希望作为输出的示例?嘿,很抱歉,这是我的错误,谢谢您的注意,您使用的是“查询设计”窗口吗?你有约翰要求的样本数据吗?每个表中只有几行就足够了。嘿,那里@Remou谢谢你指出我忘了添加它了再次感谢,你希望得到什么输出?