2

私はリレーショナルテーブルの初心者です。詳細を学ぶと、SQLステートメントの多くの利点がわかります。しかし、私はいくつかの点で立ち往生しました。

5つのテーブルから目的のデータセットの単一のテーブルを取得できるかどうかを探します。'eta'という名前のテーブルの1つは、他の4つのテーブルを接続するために使用されます。

目的:電話番号または電子メールは多くのユーザーが使用でき、ユーザーは複数の電話番号または電子メールアドレスを持っている場合もあります。電話番号または電子メールアドレスを、それらを使用するユーザー名とともにリストしたい。

サンプルデータ: テーブル構造とサンプルデータセットについては、http ://sqlfiddle.com/#!2/60acceを確認してください。

電話ケースの最終的な予想最終結果は次のとおりです。

  phone            name    extra
  45336467      ABC Co.   
  45336467      Gery      114
  45336467      Todd      117
  45336467      Adam      119

ありがとう

編集:テーブル関係の説明。

テーブル'eta'には、テーブルリレーションを持つ4つのフィールドがあります。列「own」は、会社、人などの値を示します。会社の場合は「f」、他の人の場合は「k」が別のテーブルに使用されます。

自身のフィールドの参照テーブルのIDのv1_id。

列「res」は、電子メールと電話のテーブルを示します。電話の場合は値「t」、電子メールの場合は値「e」。resフィールドの参照テーブルのIDのv2_id

4

1 に答える 1

3

スキーマをファイリングした後、次のクエリが機能するはずです。

SELECT
    phone.tel AS phone,
    CASE WHEN person.name IS NULL THEN company.titles ELSE person.name END AS name,
    eta.extra AS extra
FROM
    eta
    LEFT JOIN person
        ON eta.v1_id = person.id
        AND eta.own = 'k'
    LEFT JOIN company
        ON eta.v1_id = company.id
        AND eta.own = 'f'
    JOIN phone
        ON phone.id = eta.v2_id
WHERE
    eta.res = 't'

eta.res = 't'これは、関係が「電話」テーブルに対するものであると想定しています。また、eta.own = 'k'人々のeta.own = 'f'ために、企業のために。

2つの左結合を使用してperson/companyテーブルからプルするため、1つのクエリでプルを実行できます。person.name列がnullの場合、それは現在のレコードがcompanyテーブルからのものであり、代わりにその値を選択することを意味します(名前列に対して)。

eta.res = 'e'電子メールアドレスを選択するためにも同じことができます(電子メールテーブルに関連していると仮定します)。

SELECT
    email.email AS email,
    CASE WHEN person.name IS NULL THEN company.titles ELSE person.name END AS name
FROM
    eta
    LEFT JOIN person
        ON eta.v1_id = person.id
        AND eta.own = 'k'
    LEFT JOIN company
        ON eta.v1_id = company.id
        AND eta.own = 'f'
    JOIN email
        ON email.id = eta.v2_id
WHERE
    eta.res = 'e'
于 2012-11-07T14:58:17.903 に答える