访问2010 sql以选择两个记录之一

时间:2014-09-10 20:46:25

标签: sql ms-access-2010 iif

我很确定我必须使用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

1 个答案:

答案 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中不存在。