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

时间:2016-06-21 09:29:37

标签: sql postgresql inner-join one-to-many

我正在实施一个提供几个场地开放时间的应用程序。我的数据库实现的简化版本包含两个表:

+-----------+    +------------------+
|    Venue  |    |    opening_hour  |
+-----------+    +------------------+
|  venue_id |    |  opening_hour_id |
|    name   |    |        day       |
+-----------+    |  close_time      |
                 |  open_time       |
                 |  venue_id        |
                 +------------------+

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

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

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行,其名称和相应的日期相同。结果我发现自己有很多重复的数据,我必须在服务器端操作。

我可以从我的小型数据库知识中想到的唯一两个解决方案是遵循当前的解决方案或提取所有场地,然后对每个场所执行单个查询以提取其开放时间。后者显然是更糟糕的解决方案,因为它需要大量的数据库请求。

有没有更好的方法呢?理想的情况是接收一行包含场地名称和所有开放时间形成的阵列。

注意:在这种情况下不确定这是否相关,但我使用的是PostgreSQL数据库。

2 个答案:

答案 0 :(得分:1)

这将提供场地名称以及场地开放时的所有日子:

SELECT ven.name, array_agg(oh.day)
FROM venue ven
     NATURAL JOIN opening_hour oh
GROUP BY ven.name;

答案 1 :(得分:0)

对于那些使用MSSQL的人;

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。它只是一个数组格式的字符串。