不可更新的查询

时间:2014-08-27 08:57:52

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

由于我不是sql的英雄,我通过ms访问的设计视图创建了以下SQL语句。

SELECT tbl_comments.Comments, tbl_mfr0004.Delivery
FROM tbl_mfr0004 
INNER JOIN tbl_current_orders ON (tbl_mfr0004.MFR0004_ID = tbl_current_orders.MFR0004_ID)
INNER JOIN tbl_comments ON (tbl_current_orders.Current_orders_ID = tbl_comments.Current_orders_ID) 
WHERE (tbl_mfr0004.Delivery = get_gvStepDelivery());

查询具有双内连接,如下图所示: enter image description here

该查询有效,因此可以从comments获取字段tbl_comments,从Delivery获取字段tbl_mfr0004

enter image description here

现在的问题是,此记录集不可更新。由于我希望在userform中使用此查询来添加注释,因此这是一个问题。 不幸的是,我不知道如何重写一个像这个复杂的查询,如果它甚至可能。

我在考虑使用子查询来选择正确的orderID,但不幸的是我没有管理。

2 个答案:

答案 0 :(得分:0)

好的,我这次通过vba解决了这个问题; 我已经创建了函数get_gvStepDelivery()以从另一个子表单中获取传递,在current事件中,全局变量gvStepDelivery被赋值为Me.Delivery

Public Function get_gvStepDelivery() As Long
    get_gvStepDelivery = gvStepDelivery
End Function

现在,我创建了另一个函数,它是DLookup()CurrentOrderIDMFR0004_ID的{​​{1}}的双Delivery,因为它们都是唯一的。

Public Function getorderid(Delivery As Long) As Long
    getorderid = DLookup("Current_orders_ID", "tbl_current_orders", "[MFR0004_ID] = " & DLookup("MFR0004_ID", "tbl_mfr0004", "[Delivery] = " & Delivery))
End Function

使用getorderid(get_gvStepDelivery())在查询中调用此函数。 最终的SQL语句变为:

SELECT tbl_comments.Comments, tbl_comments.Current_orders_ID
FROM tbl_comments
WHERE (((tbl_comments.Current_orders_ID)=getorderID(get_gvStepDelivery())));

这是可行的,并且可以更新。

我仍然想知道,是否可以重写查询以获得所需的结果?

答案 1 :(得分:0)

连接永远不可更新。

如果您想要一个可更新的查询,也许您可​​以将其重写为select-list中具有子选择的select。即。

SELECT (SELECT tbl_comments.Comments
        FROM tbl_current_orders ON (tbl_mfr0004.MFR0004_ID = tbl_current_orders.MFR0004_ID)
            INNER JOIN tbl_comments ON (tbl_current_orders.Current_orders_ID = tbl_comments.Current_orders_ID),
       tbl_mfr0004.Delivery
FROM tbl_mfr0004 
WHERE (tbl_mfr0004.Delivery = get_gvStepDelivery());

如果递送的评论不止一条,则此查询会引发错误!