Estou escrevendo uma consulta SQL para extrair registros de várias tabelas para enviar as notificações de email de atualização ou de novos valores adicionados ao usuário.
Na consulta SQL abaixo, estou obtendo todos os registros atualizados nas respectivas tabelas, mas quero adicionar uma verificação condicional/JOIN em cada estado LEFT JOIN para a AssociatedRecordID
coluna da NotificationQueue
tabela, para que eu puxe apenas os registros correspondentes de cada tabela selecionada para aumentar o desempenho da execução da consulta.
Por exemplo:
LEFT JOIN Note nt WITH(NOLOCK) ON op.OpportunityID = nt.RecordID AND nt.NoteID = nq.AssociatedRecordID
Aqui eu quero usar nq.AssociatedRecordID
para JoinAND nt.NoteID = nq.AssociatedRecordID
Consulta:
SELECT ops.* FROM NotificationQueue nq
INNER JOIN (
SELECT op.OpportunityID, op.Name AS [OpportunityName], ua.Email AS OwnerEmail, nt.NoteID, nt.Note,
tks.TaskID, tks.ActivityType, ua.FirstName, ua.LastName, FORMAT(getdate(), 'M/dd/yyyy, hh:mm:ss tt') AS [datetime],
lead.LeadID, lead.LeadName
FROM Opportunity op WITH(NOLOCK)
INNER JOIN UserAccount ua WITH(NOLOCK) on op.owner = ua.UserID
LEFT JOIN Note nt WITH(NOLOCK) ON op.OpportunityID = nt.RecordID AND nt.EntityID = 4 -- OPPORTUNITY
LEFT JOIN (
SELECT t.TaskID, t.TaskTypeID, t.OpportunityID, tt.Description AS [ActivityType] FROM Task t WITH(NOLOCK)
INNER JOIN TaskType tt ON t.TaskTypeID = tt.TaskTypeID
) tks ON op.OpportunityID = tks.OpportunityID
LEFT JOIN (
SELECT l.LeadID, l.Topic AS [LeadName], lo.AssociatedOpportunityId FROM LeadOpportunity lo WITH(NOLOCK)
INNER JOIN Lead l ON lo.ParentLeadId = l.LeadID
WHERE l.Active = 1
) lead ON op.OpportunityID = lead.AssociatedOpportunityId
WHERE op.Active = 1
) ops ON nq.RecordID = ops.OpportunityID
WHERE nq.Processed = 'N'
Estou recebendo os registros esperados da consulta acima, mas quero usar a AssociatedRecordID
coluna da NotificationQueue
tabela em todas as LEFT JOIN
instruções para um melhor desempenho. Qualquer sugestão de como devo conseguir o mesmo seria apreciada.
Você pode querer usar o operador EXISTS com Sub-consulta, mas que atendem em cenários diferentes, no seu caso, mover
NotificationQueue
a tabela para a sub-consulta pode fazer com que você faça o join que está procurando, segue o exemplo do mesmo:Conforme comentário, segue o exemplo de last
LEFT JOIN
: