2017-07-26 39 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;