Изменить существующий sql на левое соединение только при первом совпадении - PullRequest
0 голосов
/ 17 июня 2019

Добавление некоторой исходной информации для исторических целей, поскольку я думал, что упрощение поможет, но это не помогло. У нас есть эта хранимая процедура, в этой части она выбирает записи из таблицы 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)

1 Ответ

2 голосов
/ 17 июня 2019

Вы можете попробовать OUTER APPLY подзапрос, получив только одну подходящую строку.

...
FROM calldetail_reporting_agents
     OUTER APPLY (SELECT TOP 1
                         *
                         FROM intx_Participant ip
                         WHERE ip.callidkey = calldetail_reporting_agents.callid) intx_participant
WHERE ...

Вы должны добавить ORDER BY в подзапрос. В противном случае не определено, какая строка берется в качестве первой. Или, может быть, это не проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...