MS ACCESS查询

时间:2011-02-03 17:34:53

标签: ms-access ms-access-2003

由于Where条件(tblEventLog.PartNumberChgLvl)中的两列,此查询无效。 我应该如何更改查询才能解决问题?

strNewSql1 = _
    "SELECT DISTINCT " & _
        "tblRevRelLog_Detail.PartNumber, " & _
        "tblRevRelLog_Detail.ChangeLevel " & _
    "FROM tblRevRelLog_Detail LEFT JOIN tblEventLog " & _
        "ON (tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber) " & _
        "AND (tblEventLog.PartNumberChgLvl " & _
            "= tblRevRelLog_Detail.ChangeLevel) " & _
    "WHERE (tblEventLog.PartNumber, tblEventLog.PartNumberChgLvl) NOT IN " & _
        "(SELECT tblEventLog.PartNumber, tblEventLog.PartNumberChgLvl " & _
        "FROM tblEventLog " & _
        "WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper' " & _
            "AND tblEventLog.PartNumber =  tblRevRelLog_Detail.PartNumber " & _
            "AND tblEventLog.PartNumberChgLvl " & _
                "= tblRevRelLog_Detail.ChangeLevel) " & _
        "AND tblEventLog.TrackingNumber = """ & tempTrackingNumber & """ " & _
        "AND tblEventLog.PartNumber =  tblRevRelLog_Detail.PartNumber " & _
        "AND tblEventLog.PartNumberChgLvl =  tblRevRelLog_Detail.ChangeLevel;"

我通过一个例子展示了这一点。

示例:让我们拿两个包1和2

包1有一个-1,b-0,c-1 Partnumber,带有changelevels和 包2具有a-1,d-1,e-1 Partnumber with changelevels

如果我从包1中删除“a-1”,那应该不会显示该包但它应该显示包2.此查询它也没有显示在包2中。

Reviewrelease_Form(主要表格)链接到reviewreleasetable:

此表包含基本数据和包装编号

包装编号:链接到tblRevRelLog_Detail的RevRel_Form(子表单)

event_Input是我们输入事件的子表单。当我选择一个事件时它将显示partnumbers。这是查询进入图片的地方。

这不应显示已删除的partnumbers。这工作正常。但是如果从diff包中删除了具有相同changelevl的相同部件号,那么它也不会显示在当前包中。

3 个答案:

答案 0 :(得分:0)

您何时使用“IN”比较运算符,只能将一个值与一组值进行比较。

因此,您需要将WHERE子句的该部分更改为:

WHERE 
tblEventLog.PartNumber NOT IN(SELECT tblEventLog.PartNumber FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper'AND tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber AND tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel) and

tblEventLog.PartNumberChgLvl NOT IN(SELECT tblEventLog.PartNumberChgLvl FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper'AND tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber AND tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel) 

但是,请注意,执行其中两个“内部选择”(相关子查询)可能会显着降低查询速度。使用连接进行“内部选择”可能会更好。

答案 1 :(得分:0)

猜测一下,我会说你的查询在“NOT IN”点(即它的子查询)中,如果已经从中删除了而不是显示任何部分编号任何包。这是因为子查询正在搜索所有包。您需要对其进行修改(以某种方式),以便它只考虑与感兴趣的包相关的行。

仔细查看该子查询。它为部件号,更改级别和事件类型设置条件。但是对于包裹有什么限制?如何确定哪些行与Package 1一起使用,哪些行与Package 2一起使用?

我的猜测是来自Package 1和Package 2的行混合在一起。由于它找到一行“EvtLog.EventTypeSelected ='pn REMOVED From Wrapper'”对于至少其中一个包的 True ,“NOT IN”使其 False 无论您真的想要在活动查看器中显示哪个包。


Brandon S上面所说的(关于IN与EXISTS),加上:你可能需要使用别名;例如(为子查询创建别名 EvtLog ):

"SELECT DISTINCT tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel 
FROM tblRevRelLog_Detail 
LEFT JOIN tblEventLog ON 
    (tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber) 
    AND (tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel)
WHERE NOT EXISTS (SELECT EvtLog.PartNumber, EvtLog.PartNumberChgLvl 
    FROM tblEventLog EvtLog 
    WHERE tblEventLog.PartNumber=EvtLog.PartNumber 
    AND tblEventLog.PartNumberChgLvl=EvtLog.PartNumberChgLvl
    AND EvtLog.EventTypeSelected = 'pn REMOVED From Wrapper' 
    AND EvtLog.PartNumber = tblRevRelLog_Detail.PartNumber 
    AND EvtLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel) 
AND tblEventLog.TrackingNumber = """ & tempTrackingNumber & """ 
AND tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber 
AND tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel"

答案 2 :(得分:0)

我仔细看了一下你的查询。我认为你的查询可能比它需要的更复杂。

我认为这个简化的查询可能就是您要追求的目标:

SELECT DISTINCT 
   tblRevRelLog_Detail.PartNumber, 
   tblRevRelLog_Detail.ChangeLevel 
FROM tblRevRelLog_Detail 
LEFT JOIN tblEventLog ON 
   (tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber) AND 
   (tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel)
WHERE
   tblEventLog.TrackingNumber = """ & tempTrackingNumber & """
   AND tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber 
   AND tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel;
   AND tblEventLog.EventTypeSelected <> 'pn REMOVED From Wrapper'
相关问题