由于我不是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());
查询具有双内连接,如下图所示:
该查询有效,因此可以从comments
获取字段tbl_comments
,从Delivery
获取字段tbl_mfr0004
。
现在的问题是,此记录集不可更新。由于我希望在userform中使用此查询来添加注释,因此这是一个问题。 不幸的是,我不知道如何重写一个像这个复杂的查询,如果它甚至可能。
我在考虑使用子查询来选择正确的orderID,但不幸的是我没有管理。
答案 0 :(得分:0)
好的,我这次通过vba解决了这个问题;
我已经创建了函数get_gvStepDelivery()以从另一个子表单中获取传递,在current
事件中,全局变量gvStepDelivery
被赋值为Me.Delivery
。
Public Function get_gvStepDelivery() As Long
get_gvStepDelivery = gvStepDelivery
End Function
现在,我创建了另一个函数,它是DLookup()
与CurrentOrderID
和MFR0004_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());
如果递送的评论不止一条,则此查询会引发错误!