-1

次のタスクに適切な SQL を記述する方法を何時間もかけて調査しましたが、これは私がこれまでに作成しなければならなかった最も複雑な SQL クエリであるため、最終的に何らかの助けを得る必要があると感じています :(

お客様のすべての電子メール アドレスを含む電子メール リストを作成しています。2 つのテーブルがあります。1 つは顧客レベルの情報を含む顧客テーブルで、もう 1 つは個人レベルの情報を含む担当者テーブルです。ほとんどのデータが重複しているため、両方のテーブルで同じ電子メール アドレスが発生します。しかし、両方のテーブルで電子メール アドレス フィールドが空になる可能性があるため、空の行を返したくありません。

実店舗で購入するユーザーは、顧客レベル テーブルのみに登録されることが多いですが、オンラインで購入するユーザーは、常に顧客レベル テーブルと人物レベル テーブルの両方に登録されます。

すべての電子メール アドレスを取得する完全なリストを作成したいと考えています。すべての電子メール アドレスは一意であり、電子メール アドレスは重複しておらず、電子メール アドレスは null ではありません。また、個人テーブルからデータを取得するときに、顧客テーブルの列に結合したいと考えています (以下の例の郵便番号)。

お客様

| CustomerID | Firstname | Lastname | Email              | Zipcode |
| 22         | Jeff      | Carson   | jeffcar@mail.com   | 81712   |
| 29         | John      | Doe      | null               | 51211   |
| 37         | Gina      | Andersen | null               | 21147   |
| 42         | Brad      | Cole     | brad@company.org   | 39261   |

連絡担当者

| PersonID | CustomerID | Firstname | Lastname | Email              |
| 8712     | 22         | Jeff      | Carson   | null               |
| 8916     | 29         | Jane      | Doe      | jane@doe.net       |
| 8922     | 29         | Danny     | Doe      | null               |
| 9181     | 37         | Gina      | Andersen | gina@gmail.com     |
| 9515     | 37         | Ben       | Andersen | ben88@gmail.com    |

テーブルを結合して、次のものを生成したいと考えています。

ファイナルテーブル

| PersonID | CustomerID | Firstname | Lastname | Email              | Zipcode |
| 8712     | 22         | Jeff      | Carson   | jeffcar@mail.com   | 81712   |
| 8916     | 29         | Jane      | Doe      | jane@doe.net       | 51211   |
| 9181     | 37         | Gina      | Andersen | gina@gmail.com     | 21147   |
| 9515     | 37         | Ben       | Andersen | ben88@gmail.com    | 21147   |
| null     | 42         | Brad      | Cole     | brad@company.org   | 39261   |

これはかなり一般的な作業だと思いましたが、同様の質問をする人を見つけられなかったので、専門知識に信頼を置きました.

4

3 に答える 3

2

この SQL は、探していた結果テーブルを正確に取得します。ここ SQLFiddle でプレイできるライブ デモを作成しました。

SELECT
    ContactPerson.PersonID, 
    Customer.CustomerID, 
    COALESCE(ContactPerson.FirstName, Customer.FirstName) AS FirstName,
    COALESCE(ContactPerson.LastName, Customer.LastName) AS LastName,
    COALESCE(ContactPerson.Email, Customer.Email) AS Email,
    Customer.ZipCode
FROM Customer
LEFT JOIN ContactPerson
    ON ContactPerson.CustomerID = Customer.CustomerID
WHERE COALESCE(ContactPerson.Email, Customer.Email) IS NOT NULL

結果 (希望する結果と同じ):

| PersonID | CustomerID | FirstName | LastName | Email              | ZipCode |
| 8712     | 22         | Jeff      | Carson   | jeffcar@mail.com   | 81712   |
| 8916     | 29         | Jane      | Doe      | jane@doe.net       | 51211   |
| 9181     | 37         | Gina      | Andersen | gina@gmail.com     | 21147   |
| 9515     | 37         | Ben       | Andersen | ben88@gmail.com    | 21147   |
| NULL     | 42         | Brad      | Cole     | brad@company.org   | 39261   |

理解を助けるためのいくつかの重要なポイントの簡単な説明:

このクエリは、aを使用しLEFT JOINて 2 つのテーブルを結合します。このような SQL の問題が発生すると、JOIN はかなり一般的になります。ここでは詳細な説明には立ち入りません: それらが何と呼ばれているかがわかったので、それらに関する多くの情報をグーグルで検索するのに問題はありません!

注意:COALESCE基本的には、「null ではないこれらのオプションの最初の 1 つ」(ドキュメント)を意味します。したがって、このクエリは、可能な場合は ContactPerson から、そうでない場合は Customer から名前と電子メール アドレスを取得します。これらのテーブルのいずれにも電子メール アドレスが含まれていない場合、必要に応じて、WHERE 句によってそのレコードがまったく含まれていないことが確認されます。

于 2013-11-05T15:10:42.510 に答える