我有 3 表:
第1桌 - Staff
:
------------------------------------
| person_id | name | studio_id |
|-----------|----------|-----------|
| 1 | Bill | 1 |
| 2 | Kate | 1 |
------------------------------------
第二桌 - 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 :(得分:0)
问题在于,您在技术上不会获得重复项,如果查看输出,您可以看到没有两行完全相同。在这种情况下,由于album
和staff
都链接到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
如果你运行它,我真的很有兴趣看到输出,因为我不幸的是现在无法测试。如果你不能编辑结构,哪个歌手可以随机或重复哪个专辑。我建议与负责数据库的人交谈并解释其结构不正确,并要求他/她修复它。
答案 1 :(得分:0)
没有任何东西可以说明哪张专辑属于哪个职员,因为专辑只有工作室的外键,而且你有两个与同一个工作室有关系的工作人员,你得到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;