我很确定我必须使用IIF声明,但我不确定如何在这种情况下实现它...
我正在编写一个查询来检查来自一个地方的用户ID与主记录集。但是,在某些情况下,我用来从主记录集中获取用户ID的标准有时会链接到多个用户ID。一个是已删除的人的用户ID,一个是活动的用户。如果返回了两个记录,我需要我的查询来选择活动人而不是被删除的人...
到目前为止,这是我的查询
INSERT INTO VExceptions ( Carrier, [Wireless Number], Period, Carrier_UserName, Carrier_UserID, Parsed_PersNo_Carrier, MT_UserID, MT_Cost_Center, MT_Status, [CountOfUser ID], IsSpare )
SELECT LoadFile_VCharges.Carrier, LoadFile_VCharges.[Wireless Number], LoadFile_VCharges.Period, LoadFile_VCharges.[User Name], LoadFile_VCharges.[User ID], LoadFile_VCharges.[Personnel Number], MT.UserID, MT.CostCenter, MT.Status, Count(MT.UserID) AS CountOfUserID, IIf(InStr(1,[User Name],"SPARE")>0,1,0) AS IsSpare
FROM LoadFile_VCharges LEFT JOIN MT ON LoadFile_VCharges.[Personnel Number] = MT.PersonnelNumber
GROUP BY LoadFile_VCharges.Carrier, LoadFile_VCharges.[Wireless Number], LoadFile_VCharges.Period, LoadFile_VCharges.[User Name], LoadFile_VCharges.[User ID], LoadFile_VCharges.[Personnel Number], MT.UserID, MT.CostCenter, MT.Status, IIf(InStr(1,[User Name],"SPARE")>0,1,0)
HAVING (((LoadFile_VCharges.[User ID])="NA" Or (LoadFile_VCharges.[User ID])<> [MT].[UserID]))
ORDER BY LoadFile_VCharges.[Wireless Number];
除了有时选择错误的记录之外,此查询工作正常...
任何建议都将不胜感激。
此致
AG
答案 0 :(得分:0)
一种策略是在两个子查询上保持连接,一个用于活动集,另一个用于非活动集。然后在select子句中选择第一个非null的选项。你可以用COALESC,CASE或Nz做到这一点。我认为Access 2010使用Nz。 Nz(active.UserID,inactive.UserID)所说的是&#34;如果它存在则使用active.UserID,如果它为null则使用inactive.UserID。&#34;
SELECT LoadFile_VCharges.Carrier
, LoadFile_VCharges.[Wireless Number]
, LoadFile_VCharges.Period
, LoadFile_VCharges.[User Name]
, LoadFile_VCharges.[User ID]
, LoadFile_VCharges.[Personnel Number]
, Nz(active.UserID, inactive.UserID)
, Nz(active.CostCenter, inactive.CostCenter)
, Nz(active.Status, inactive.Status)
, Count(LoadFile_VCharges.[User ID]) AS CountOfUserID
, IIf(InStr(1,[User Name],"SPARE")>0,1,0) AS IsSpare
FROM LoadFile_VCharges
LEFT JOIN (SELECT UserID, CostCenter, Status FROM MT WHERE Status = 'Active') active ON (LoadFile_VCharges.[Personnel Number] = active.PersonnelNumber)
LEFT JOIN (SELECT UserID, CostCenter, Status FROM MT WHERE Status = 'Deleted') inactive ON (LoadFile_VCharges.[Personnel Number] = inactive.PersonnelNumber)
GROUP BY LoadFile_VCharges.Carrier
, LoadFile_VCharges.[Wireless Number]
, LoadFile_VCharges.Period
, LoadFile_VCharges.[User Name]
, LoadFile_VCharges.[User ID]
, LoadFile_VCharges.[Personnel Number]
, MT.UserID, MT.CostCenter
, MT.Status
, IIf(InStr(1,[User Name],"SPARE")>0,1,0)
HAVING (((LoadFile_VCharges.[User ID])="NA" Or (LoadFile_VCharges.[User ID])<>[MT].[UserID]))
ORDER BY LoadFile_VCharges.[Wireless Number];
您可能需要摆弄语法。您可能只需要在UserID列上使用Nz,我不确定。我确定还有其他方法可以做到这一点。我试图想到一个连接,然后你得到整个活动集(完全连接),只有非活动集不与活动集(外连接)重叠。 在MS SQL(非访问)中,我会使用窗口函数,但我不认为在Access中不存在。