首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL内部连接中的结果重复与一对多的关系

SQL内部连接中的结果重复与一对多的关系
EN

Stack Overflow用户
提问于 2016-06-21 09:29:37
回答 2查看 749关注 0票数 0

我正在实施一个应用程序,提供了几个场馆的开放时间。我的DB实现的简化版本由两个表组成:

代码语言:javascript
复制
+-----------+    +------------------+
|    Venue  |    |    opening_hour  |
+-----------+    +------------------+
|  venue_id |    |  opening_hour_id |
|    name   |    |        day       |
+-----------+    |  close_time      |
                 |  open_time       |
                 |  venue_id        |
                 +------------------+

在这种情况下,场地和开放时间之间存在一对多的关系。

现在,我想检索数据库中所有可供使用的场馆及其相应的开放时间的列表。为了解决这个问题,我使用了以下代码:

代码语言:javascript
复制
SELECT  ven.name as name, oh.day as day
FROM venue ven INNER JOIN opening_hour oh
ON oh.venue_id = ven.venue_id

使用此实现,对于每一天的开放时间,我都会得到一个包含场地名称和日期值的行结果。这意味着,如果一个场地每周开放6天,我将收到6排相同的名字和相应的一天。因此,我发现自己有很多重复的数据,我必须在服务器端操作这些数据。

从我的小DB知识中,我能想到的唯一两个解决方案是要么遵循当前的解决方案,要么提取所有的场馆,然后对每个场馆执行一个查询,以便提取它们的开放时间。后者显然是更糟的解决方案,因为它需要大量荒谬的DB请求。

有谁能找到更好的方法吗?理想的做法是接收一行,其中包含场地名称和由所有开放时间组成的数组。

注意:不确定这在本例中是否相关,但我使用的是PostgreSQL数据库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-21 10:03:18

这将给出场地名称和所有开放日期的数组:

代码语言:javascript
复制
SELECT ven.name, array_agg(oh.day)
FROM venue ven
     NATURAL JOIN opening_hour oh
GROUP BY ven.name;
票数 2
EN

Stack Overflow用户

发布于 2016-06-21 10:16:43

对于使用MSSQL的;

代码语言:javascript
复制
SELECT
    v.name,
    REPLACE(REPLACE(REPLACE('['+(
        SELECT
            '''' + convert(nvarchar(max),s2.open_time) + '''' as a
        FROM opening_hour s2
        WHERE s2.venue_id= s.venue_id 
        FOR XML PATH('')
     ) + ']','<a>',''),'</a>',','),',]',']') as opening_hours
FROM opening_hour s
INNER JOIN Venue v on v.venue_id = s.venue_id
GROUP BY s.venue_id,v.name

这里需要注意的是,它不返回数据类型Array。它只是一个数组格式的字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37940580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档