即使其他表没有此类产品数据,如何连接表来显示产品

时间:2012-10-04 02:35:55

标签: sql ms-access

我过去常常把这个问题发布到SO,但我给出的答案显示了来自tbl_product的所有表格,而不是来自tbl_inventory和tbl_reserve。你能帮忙吗?非常感谢你。

    tbl_inventory
    inv_id | pd_id | inv_qty_act |  inv_date | inv_note
     1     |  001  |  120        |  20-Sep-12| 
     2     |  003  |  387        |  1-Oct-12 |

    tbl_reserve
    res_id | cust_id | res_date | res_duedate | pd_id | res_qty | if_sent | res_note
     3     |  10     | 01-Oct-12|   17-Oct-12 |  001  |  135    |         | 
     4     |  9      | 01-Oct-12|   24-Oct-12 |  001  |  253    |         |
     5     |  22     | 01-Oct-12|   17-Oct-12 |  001  |  132    |         | 
     6     |  2      | 01-Oct-12|   24-Oct-12 |  002  |  446    |         | 


    tbl_product
    pd_id  | pd_name 
      001  |  des1
      002  |  des2
      003  |  des3

    tbl_pdtn_startup
    pdtn_st_id | pd_id | pdtn_qty_est
    2         |  002  |  200
    3         |  003  |  100

我想要的输出:
为了让我更容易,我真正想要的是报告显示:
1.产品名称(pd_name)
2.成品数量(inv_qty_act)
3.生产中的估计数量(pdtn_qty_est)
4.和客户保留的产品总和(Sum(res_qty)。

至于总字段,我可以从代码中计算出来。非常感谢你

     pd_id| pd_name| inv_qty_act|pdtn_qty_est| Sum(res_qty)| Total[(inv_qty_est) - Sum(res_qty)]
      001 | des1   |    120     |   0        |   520       |     -400 -->(120-520)
      002 | des2   |     0      |   200      |   446       |     -446 -->(0-446)
      003 | des3   |    387     |   100      |     0       |      387

desired outcome

我真正想要的结果是只有“红色”矩形的记录

2 个答案:

答案 0 :(得分:1)

要在Access SQL中连接两个以上的表,必须将每个JOIN放在括号中:

SELECT
    tbl_product.pd_id,
    tbl_product.pd_name,
    tbl_inventory.inv_qty_act,
    tbl_pdtn_startup.pdtn_qty_est,
    Sum(tbl_reserve.res_qty) AS [Sum(res_qty)]
FROM 
    ((tbl_product 
    LEFT JOIN tbl_inventory ON tbl_product.pd_id = tbl_inventory.pd_id) 
    LEFT JOIN tbl_pdtn_startup ON tbl_product.pd_id = tbl_pdtn_startup.pd_id) 
    LEFT JOIN tbl_reserve ON tbl_product.pd_id = tbl_reserve.pd_id
GROUP BY
    tbl_product.pd_id,
    tbl_product.pd_name,
    tbl_inventory.inv_qty_act,
    tbl_pdtn_startup.pdtn_qty_est;

如果您不确定Access中的正确语法,只需在查询设计器中构建查询,然后切换到SQL View。查询设计器将自动添加括号。

还有一件事:
在您想要的输出中,inv_qty_actpdtn_qty_estSum(res_qty)列中的缺失值为零。在vanilla LEFT JOIN查询中,这些将是NULL

所以我的上面的查询实际上返回了这个:

 pd_id| pd_name| inv_qty_act|pdtn_qty_est| Sum(res_qty)| ...
  001 | des1   |    120     |   NULL     |   520       | ...
  002 | des2   |    NULL    |   200      |   446       | ...
  003 | des3   |    387     |   100      |   NULL      | ...

                     ^           ^            ^
                     |           |            |
                     |___ NULL instead of 0 __|

如果您想获得0而不是NULL,则必须使用Nz()函数将NULL值转换为零。
而不是SELECT column,只需使用SELECT Nz(column, 0)

所以最终的查询看起来像这样:

SELECT
    tbl_product.pd_id,
    tbl_product.pd_name,
    nz([inv_qty_act],0),
    nz([pdtn_qty_est],0),
    Sum(nz([res_qty],0)) AS [Sum(res_qty)]
FROM 
    ((tbl_product 
    LEFT JOIN tbl_inventory ON tbl_product.pd_id = tbl_inventory.pd_id) 
    LEFT JOIN tbl_pdtn_startup ON tbl_product.pd_id = tbl_pdtn_startup.pd_id) 
    LEFT JOIN tbl_reserve ON tbl_product.pd_id = tbl_reserve.pd_id
GROUP BY
    tbl_product.pd_id,
    tbl_product.pd_name,
    tbl_inventory.inv_qty_act,
    tbl_pdtn_startup.pdtn_qty_est;

修改

好的,试试这个:

SELECT
    tbl_product.pd_id,
    tbl_product.pd_name,
    nz([inv_qty_act],0),
    nz([pdtn_qty_est],0),
    Sum(nz([res_qty],0)) AS [Sum(res_qty)]
FROM 
    ((tbl_product 
    LEFT JOIN tbl_inventory ON tbl_product.pd_id = tbl_inventory.pd_id) 
    LEFT JOIN tbl_pdtn_startup ON tbl_product.pd_id = tbl_pdtn_startup.pd_id) 
    LEFT JOIN tbl_reserve ON tbl_product.pd_id = tbl_reserve.pd_id
GROUP BY
    tbl_product.pd_id,
    tbl_product.pd_name,
    tbl_inventory.inv_qty_act,
    tbl_pdtn_startup.pdtn_qty_est
HAVING
    tbl_inventory.inv_qty_act IS NOT NULL
    or tbl_pdtn_startup.pdtn_qty_est IS NOT NULL

查询与上面相同,只有最后三行(HAVING子句)是新的 所有不在tbl_inventorytbl_pdtn_startup的产品都会被忽略 这是你想要的吗?

答案 1 :(得分:0)

使用“左连接”显示产品,即使其他表没有此类产品