我有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 |
------------------------------------------------------发布于 2017-07-26 17:35:29
问题是,从技术上讲,您没有得到重复的数据,如果您查看输出,就会发现没有两行是完全相同的。在本例中,由于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如果您运行该程序,我很想看到输出,因为很不幸,我现在无法进行测试。如果你不能编辑结构的话,哪一张专辑可能是随机的还是重复的。我建议与负责数据库的人交谈,并解释数据库的结构不正确,并要求他/她修复它。
发布于 2017-07-26 18:10:09
没有什么能说明什么专辑属于什么工作人员,因为专辑只有录音室的外键,而且有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;https://stackoverflow.com/questions/45333659
复制相似问题