2017-07-26 8 views
0

Iはテーブルを有する:表示異なるテーブルデータ

第1表 - Staff

------------------------------------ 
| person_id | name | studio_id | 
|-----------|----------|-----------| 
|  1  | Bill |  1  | 
|  2  | Kate |  1  | 
------------------------------------ 

2表 - Studio

----------------------------- 
| studio_id | studio_name | 
|-----------|---------------| 
|  1  | PeopleProd | 
|  2  | TheBest | 
----------------------------- 

3位表 - Album

----------------------------------- 
| album_id | Name | studio_id | 
|----------|----------|-----------| 
|  1 | Hits |  1  | 
|  2 | Goldset |  1  | 
----------------------------------- 

私が一列にそれらを表示したいので、結果は次のようになります。

------------------------------------------------------ 
| studio_id | studio_name | person_name | album_name | 
|-----------|-------------|-------------|------------| 
|  1  | PeopleProd |  Bill |  Hits | 
|  1  | PeopleProd |  Kate | GoldSet | 
------------------------------------------------------ 

しかし、私はJOINクエリを使用しています、私は重複を受けています:

SELECT studio_id studio_name person_name album_name 
FROM Studio s 
JOIN Album a ON s.studio_id = a.studio_id 
JOIN Staff ss ON s.studio_id = ss.studio_id`. 

これをどのように修正できますか?

今すぐ出力:あなたは出力を見れば

------------------------------------------------------ 
| studio_id | studio_name | person_name | album_name | 
|-----------|-------------|-------------|------------| 
|  1  | PeopleProd |  Bill | Hits | 
|  1  | PeopleProd |  Kate | Hits | 
|  1  | PeopleProd |  Bill | GoldSet | 
|  1  | PeopleProd |  Kate | GoldSet | 
------------------------------------------------------ 
+0

をあなたはどのようなSQLのバリエーションを使用していますか? – yanman1234

+0

mssql server 2008 – Martin

+1

なぜ 'Bill'は' Hits'しか取得できないのですか?代わりに 'GoldSet'を使用しないでください –

答えて

0

問題は、あなたが技術的に重複を取得していないということです、あなたには2つの行がまったく同じではないことがわかります。この場合、albumstaffstudioにリンクしているため、目的の出力を得るための唯一の方法は、テーブル構造を変更することです。

この問題を解決する最も簡単な方法は、アルバムテーブルにperson_id外部キーを追加し、次にjoin Staff ss on s.studio_id = ss.studio_idjoin Staff ss on ss.person_id = a.person_idに変更することです。この方法では、アルバムをスタッフに直接リンクして、重複の問題を回避することができます。

テーブル構造を変更できないため、唯一のチャンス(とにかく考えることができる)はgroup byです。はい、あなたは関数を呼び出す必要がありますが、アルバムとスタッフが、各行に対して同じスタジオに参加すると仮定すると、あなたはこれで逃げることができる必要があります:

select max(s.studio_id), max(s.studio_name), ss.person_name, a.album_name 
from Studio s 
join Album a on s.studio_id = a.studio_id 
join Staff ss on s.studio_id = ss.studio_id 
group by ss.person_name, a.album_name 

あなたがいることを実行する場合、私はなるだろう私は残念なことに今のところテストすることができないので、実際に出力を見ることに興味があります。構造を編集できない場合、どの歌手がどのアルバムと揃っているかはランダムまたは重複している可能性があります。私は、データベースを担当している人と話し、それが不適切に構造化されていることを説明し、それを修正するように頼むことをお勧めします。

+0

私は構造を変更できません( – Martin

+1

私の更新された答えに記載されているように、あなたの唯一の現実的な選択肢は構造を変更することです、そうでなければ歌手をアルバムにリンクする方法はありません。あなたは@Martinを何ができるのですか? – Aaron

0

スタジオへの外部キーしかなく、同じスタジオとの関係を持つ2人のスタッフがいるため、どのアルバムがどのスタッフに属しているかはわかりません。それぞれ4つの結果が得られますすべてのアルバムとすべてのスタッフが同じスタジオに関連しています。あなたのモデルに欠陥があります。アルバムからのスタッフとの関係を追加する。 JOINは算術として機能するので、この結果は常に得られます。あなたが望むものがちょうどそれらを並べて置かれているならば、this questionを見てください。

は、基本的にはちょうどそれに応じて仮想キー「を作成」と参加:

select s.studio_id, s.studio_name, ss.person_name, a.album_name 
from Studio s left join 
    (select st.*, row_number() over (order by staff_id) as seqnum 
     from Staff st 
    ) ss on s.studio_id = st.studio_id 
    full outer join 
    (select al.*, row_number() over (order by album_id) as seqnum 
     from Album al 
    ) a 
    on ss.seqnum = a.seqnum; 
where s.studio_id = 1; 
関連する問題