Добавление некоторой исходной информации для исторических целей, поскольку я думал, что упрощение поможет, но это не помогло. У нас есть эта хранимая процедура, в этой части она выбирает записи из таблицы A (calldetail_reporting_agents) и выполняет левое соединение с таблицей B (Intx_Participant). Очевидно, в таблице B есть дублирующиеся строки, которые мы не хотим. Есть ли простой способ изменить это, чтобы выбрать только первое совпадение в таблице B? Или мне нужно будет все переписать?
SELECT 'Agent Calls' AS CallType,
CallDate,
CallTime,
RemoteNumber,
DialedNumber,
RemoteName,
LocalUserId,
CallDurationSeconds,
Answered,
AnswerSpeed,
InvalidCall,
Intx_Participant.Duration
FROM calldetail_reporting_agents
LEFT JOIN Intx_Participant ON calldetail_reporting_agents.CallID = Intx_Participant.CallIDKey
WHERE DialedNumber IN ( SELECT DialedNumber
FROM #DialedNumbers )
AND ConnectedDate BETWEEN @LocStartDate AND @LocEndDate
AND (@LocQueue IS NULL OR AssignedWorkGroup = @LocQueue)
Упрощенная версия: как изменить ниже, чтобы выбрать только первую соответствующую строку из таблицы B:
SELECT columnA, columnB FROM TableA LEFT JOIN TableB ON someColumn
Я изменил это на первый ответ, и теперь все данные выглядят точно так, как ожидалось. Спасибо всем за быструю и внимательную помощь.
SELECT 'Agent Calls' AS CallType,
CallDate,
CallTime,
RemoteNumber,
DialedNumber,
RemoteName,
LocalUserId,
CallDurationSeconds,
Answered,
AnswerSpeed,
InvalidCall,
Intx_Participant.Duration
FROM calldetail_reporting_agents
OUTER APPLY (SELECT TOP 1
*
FROM Intx_Participant ip
WHERE calldetail_reporting_agents.CallID = ip.CallIDKey
AND calldetail_reporting_agents.RemoteNumber = ip.ConnValue
AND ip.HowEnded = '9'
AND ip.Recorded = '0'
AND ip.Duration > 0
AND ip.Role = '1') Intx_Participant
WHERE DialedNumber IN ( SELECT DialedNumber
FROM #DialedNumbers )
AND ConnectedDate BETWEEN @LocStartDate AND @LocEndDate
AND (@LocQueue IS NULL OR AssignedWorkGroup = @LocQueue)