MySQL: declaração de junção complexa envolvendo duas mesas e uma terceira tabela de correlação

StackOverflow https://stackoverflow.com/questions/2814712

Pergunta

Eu tenho duas tabelas que foram construídas para dois sistemas díspares. Eu tenho registros em uma tabela (chamada "leads") que representam clientes e registros em outra tabela (chamada "gerente") que são exatamente os mesmos clientes, mas o "gerente" usa campos diferentes

(Por exemplo, "Leads" contém um endereço de e-mail e o "gerente" contém dois campos para dois e-mails diferentes-ou seja, o email de "leads").

Então, eu criei uma tabela de correlação que contém o Lead_ID e o Gerenciador_ID. Atualmente, esta tabela de correlação está vazia.

Estou tentando consultar a tabela "Leads" para me dar registros que correspondem ao campo de e -mail "gerente" com o único campo de email "Leads", ao mesmo tempo em que ignorava os campos que já foram adicionados à tabela "correlacionada" . (Dessa forma, posso ver quantos leads que correspondem ainda não foram correlacionados.) Aqui está minha tentativa atual e inválida de SQL:

SELECT leads.id, manager.id
  FROM leads, manager
  LEFT OUTER JOIN correlation ON correlation.lead_id = leads.id
  WHERE correlation.id IS NULL
  AND leads.project != "someproject"
  AND (manager.orig_email = leads.email OR manager.dest_email = leads.email)
  AND leads.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-10 23:59:59'
  ORDER BY leads.created ASC;

Recebo o erro: coluna desconhecida 'leads.id' em 'on cláusula'

Antes que você se pergunte: existem registros na tabela "Leads" onde leads.project! = "Algum projeto" e leads.created Falls entre essas datas. Incluí esses parâmetros adicionais para a completude.

Foi útil?

Solução

Você tem as mesas listadas da maneira errada, para que a junção externa esquerda esteja se juntando manager para correlation ao invés de leads para correlation Como você pretendia. Tente trocá -los em volta:

SELECT leads.id, manager.id
  FROM manager, leads
  LEFT OUTER JOIN correlation ON correlation.lead_id = leads.id
  WHERE correlation.id IS NULL
  AND leads.project != "someproject"
  AND (manager.orig_email = leads.email OR manager.dest_email = leads.email)
  AND leads.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-10 23:59:59'
  ORDER BY leads.created ASC;

Em geral, eu recomendo não misturar junções antigas e novas para evitar exatamente esse tipo de erro. Eu prefiro ver algo assim:

SELECT leads.id, manager.id
  FROM leads
  LEFT OUTER JOIN correlation ON correlation.lead_id = leads.id
  JOIN manager ON manager.orig_email = leads.email OR manager.dest_email = leads.email
  WHERE correlation.id IS NULL
  AND leads.project != "someproject"
  AND leads.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-10 23:59:59'
  ORDER BY leads.created ASC;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top