2014-09-10 2 views
0

Я уверен, что я должен использовать заявление IIF, но я не знаю, как реализовать в этом сценарии ...доступа 2010 SQL, чтобы выбрать один из двух записей

Я пишу запрос, чтобы проверить идентификаторы пользователей из одного места в соответствии с набором основных записей. Однако в некоторых случаях критерии, которые я использую для получения идентификатора пользователя из набора основных записей, иногда ссылаются на более чем один идентификатор пользователя. Один из них - это идентификатор пользователя удаленных людей и один для активного пользователя. В том случае, когда есть две записи вернулся, мне нужен мой запрос, чтобы выбрать активный человек вместо удаленного человека ...

Вот мой запрос до сих пор

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, если он существует, если он имеет значение null, то используйте 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 в столбце UserID, я не уверен. Я уверен, что есть другие способы сделать это. Я пытаюсь думать о соединении, где вы получаете полный активный набор (полное соединение) и только неактивный набор, который НЕ перекрывает активный набор (внешнее соединение). В MS SQL (не-Access) я бы использовал функцию оконной обработки, но я не думаю, что этого не существует в Access.

+0

Спасибо за быстрый ответ. Разве это не устранит все записи, где статус удаляется? Мне все еще нужны записи со статусом удаления (если в MT есть только одна запись) ... но не тогда, когда есть запись, которая ведет к двум записям в МТ, одна удалена и одна активна. – user3708244

+0

А, ты прав. Позвольте мне понять это, и я опубликую обновление. – BClaydon

+0

ОК, так что левое соединение на двух подзапросах - одно для активного для неактивного, а затем сделать coalesc (или Nz in Access), чтобы получить активное, если оно существует. Я напишу вверх и поставлю его наверх. – BClaydon

Смежные вопросы