在一行中显示不同的表数据

时间:2017-07-26 17:22:36

标签: sql sql-server join

我有 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  |
------------------------------------------------------

2 个答案:

答案 0 :(得分: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

如果你运行它,我真的很有兴趣看到输出,因为我不幸的是现在无法测试。如果你不能编辑结构,哪个歌手可以随机或重复哪个专辑。我建议与负责数据库的人交谈并解释其结构不正确,并要求他/她修复它。

答案 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;