2014-09-10 55 views
0

一個我敢肯定,我必須使用IIF語句,但我不知道如何實現它在這種情況下...訪問SQL 2010選擇的兩個記錄

我寫一個查詢,以檢查來自一個地方的用戶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

的一種策略是左連接的兩個子查詢,一個用於激活集和一個非活動組。然後在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]; 

您可能需要擺弄語法。您可能只需要在用戶名列上輸入Nz,我不確定。我相信還有其他的方式。我試圖想到一個連接,你會得到整個活動集(完全連接),只有不活動集與活動集(外連接)不重疊。 在MS SQL(非Access)中,我會使用窗口函數,但我不認爲這在Access中不存在。

+0

感謝您的快速回復。這不會消除狀態被刪除的所有記錄嗎?我仍然希望條目的狀態爲已刪除(如果MT中只有一條記錄)......但不是當有一條記錄導致MT中的兩條記錄時,一條記錄被刪除,另一條記錄被激活。 – user3708244 2014-09-10 21:00:10

+0

啊,你是對的。讓我弄清楚,我會發布更新。 – BClaydon 2014-09-10 21:03:02

+0

好吧,所以左連接兩個子查詢 - 一個用於激活一個非活動,然後做一個coalesc(或Access中的Nz)來獲得激活,如果它存在。我會寫出來並把它放在最上面。 – BClaydon 2014-09-10 21:16:03