2017-07-26 50 views
0

我有表:顯示不同的表的數據

第一表 - Staff

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

第二表 - Studio

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

第三表 - 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

的問題是,你沒有得到技術上的重複,如果你看一下輸出,你可以看到,沒有兩行是完全一樣的。在這種情況下,由於albumstaff鏈接studio,以獲得所需的輸出的唯一方法是改變表結構。

我看到要解決這個問題的最簡單方法是將person_id外鍵添加到您的專輯表中,然後將join Staff ss on s.studio_id = ss.studio_id更改爲join 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;