0

2 つの異なるシステム用に構築された 2 つのテーブルがあります。1 つのテーブル (「リード」と呼ばれる) に顧客を表すレコードがあり、別のテーブル (「マネージャー」と呼ばれる) にはまったく同じ顧客であるが「マネージャー」が異なるフィールドを使用するレコードがあります。

(たとえば、「リード」には電子メール アドレスが含まれ、「マネージャー」には 2 つの異なる電子メール用の 2 つのフィールドが含まれます。どちらも「リード」からの電子メールである可能性があります)。

そこで、lead_id と manager_id を含む相関テーブルを作成しました。現在、この相関テーブルは空です。

「リード」テーブルにクエリを実行して、「マネージャー」メール フィールドと単一の「リード」メール フィールドのいずれかに一致するレコードを取得しようとしていますが、同時に「相関」テーブルに既に追加されているフィールドは無視します. (このようにして、一致するリードがまだ関連付けられていないリードの数を確認できます。) これが私の現在の無効な 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;

エラーが表示されます: 'on 句' の列 'leads.id' が不明です

不思議に思う前に、「leads」テーブルには、leads.project != "someproject" と lead.created がこれらの日付の間にあるレコードがあります。完全を期すために、これらの追加パラメーターを含めました。

4

1 に答える 1

2

テーブルが間違った方法でリストされているため、LEFTOUTERJOINが意図したとおりにではなくに参加managerしています。それらを交換してみてください:correlationleadscorrelation

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;

一般に、このタイプのエラーを正確に回避するために、古いスタイルと新しいスタイルの結合を混在させないことをお勧めします。私はこのようなものを見たいと思います:

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;
于 2010-05-11T21:58:01.550 に答える