【问题标题】:access 2010 sql to select one of two records访问 2010 sql 以选择两条记录之一
【发布时间】:2014-09-10 20:46:25
【问题描述】:

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

【问题讨论】:

    标签: sql ms-access-2010 iif


    【解决方案1】:

    一种策略是在两个子查询上左连接,一个用于活动集,一个用于非活动集。然后在 select 子句中选择第一个不为空的选项。您可以使用 COALESC、CASE 或 Nz 来做到这一点。我认为 Access 2010 使用 Nz。 Nz(active.UserID, inactive.UserID) 所说的是“如果存在,则使用 active.UserID,如果它为空,则使用 inactive.UserID。”

    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)中,我会使用窗口函数,但我认为 Access 中不存在。

    【讨论】:

    • 感谢您的快速回复。这不会消除删除状态的所有记录吗?我仍然想要状态为已删除的条目(如果 MT 中只有一条记录)......但当有一条记录导致 MT 中有两条记录时,一条已删除,一条处于活动状态。
    • 啊,你说得对。让我弄清楚,我会发布更新。
    • 好的,所以在两个子查询上留下连接 - 一个用于激活,一个用于非活动,然后执行 coalesc(或 Access 中的 Nz)以获取活动(如果存在)。我会写出来放在上面。
    • 谢谢先生!我一定会在早上的第一件事尝试一下!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    相关资源
    最近更新 更多