由于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的相同部件号,那么它也不会显示在当前包中。
答案 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'