2016-08-04 18 views
0

したがって、私は純粋なSQLで外部ジョインのスキルを研究しています(MySQLは私が使用しているDBMSです)。人、住所、電話番号、電子メールの4つのテーブルがあります。すべてはかなり自明です。人々はメインテーブルです、他の3つのすべてのレコードは、外部キーがPeopleテーブルを参照して含まれています。SQL:1対多の関係を持つ外部ジョイン

4つのテーブルすべてで外部結合を実行するクエリを作成したいとします。理想的には、ここで私は結果が見えるようにしたいものです。

Name   Address   Phone   Email 
Bob   5 Steel Dr  512-222-1358 [email protected] 
Bob       212-333-4444 [email protected] 
Bob          [email protected] 

アイデアは、住所/電話/電子メールの記録が全く繰り返さないことです。 Peopleテーブルの情報は繰り返すことができますが、それはうまくいきますが、他のものからの繰り返しを避けようとしています。

ここでは、私が進めているものの非常に非常に粗いバージョンです。

select p.name, e.email, a.address 
from people p 
left join email e on p.pid = e.pid 
left join address a on p.pid = a.pid 
where p.pid = 1; 

ただし、動作しません。お互いに一致するすべてのレコードを繰り返します。

私が行っている効果を得る方法はありますか?私は外側のジョイントで少し錆びています。

+0

質問が正しいと思われるようです。 – scaisEdge

答えて

1

単一のSQLクエリで記述するような出力を得るための簡単なソリューションはありません。

出力がFourth Normal Formに違反しているので、驚くべきことではありません。

正に、私は3人の質問を実行します.1人は「住所」に参加し、「人」は電話に参加し、もう1人は「電子メール」に参加しました。

結果をアプリケーションコードにまとめます。

+0

正確には:*「私の名前はボブです。私は1つのアドレスに住んでいます。あなたが知っている4つの電子メールアカウントがあります。あなたのスキーマはこれを扱うことができる必要があります、別のテーブルで、*あなたのスキーマはそれを処理することができる必要があります*例えば、*:「人」、「人の電話」、「人の電子メール」。ここには、少なくとも* 3つの1対多の関係があり、他の関係はありません。 –

2

通常、セッション変数を含む、信頼性の低い多くの「フープ」を飛び越えることはありません。

あなたが望む結果セットが存在しないことを意味することを見落としています。 5 Steel Dr512-222-1358、および[email protected]は直接接続していません。あなたの結果は、電話番号が住所に存在する可能性があることを意味します。あなたが持っているものは、並んで整列している3つのリストです。

このような結果を出力するクエリは、各行に「行番号」を付けることと同じです。

+0

+1それを説明するのに非常にいい方法です。出力の行で一緒になることが起こるエントリ間には関係がありません。 –

関連する問題