Microsoft Access联接4个表以显示3个表中的特定值,但显示主表中的所有值

时间:2018-12-17 12:50:45

标签: sql ms-access

我已经创建了一个数据库供用户“关注”电视节目,我需要创建一个表格来显示每个节目以及该特定节目的所有相关信息。

我拥有的四个表格如下:
显示(主表),
网络,
ShowGenres(将多个流派链接到一个节目),
流派。 关系和所有字段如下图所示。

Relationships:

目前,我有一个页面,显示以下信息: showID,showName,showAired,networkName,showStatus,showRuntime,showSeasons,showEpisodes,showOverview。
理想情况下,我希望有一个列表框来显示与特定节目相关的体裁的数组。我已经尝试了很长一段时间来提出一个查询来做到这一点,我设法获得的最接近的结果显示了相关信息,但添加了重复的页面。
这是我最近的尝试:

SELECT * FROM Shows A
INNER JOIN Networks B ON B.networkID = A.networkID
INNER JOIN ShowGenres C ON C.showID = A.showID
INNER JOIN Genres D ON D.genreID = C.genreID;

我们将不胜感激,在此先感谢您。

2 个答案:

答案 0 :(得分:1)

必须欣赏可以与数据逻辑结合使用的表示层逻辑。非常通用-在1:Many中-您对包含两个字段的字段的查询将对Many记录的每一个重复1个表值。这不能通过任何查询设计来更改,因为它是数据逻辑中固有的。

但是在演示级别,您可以控制显示。使用报表-数据源可以是查询-但报表属性提供了分组,您可以将1字段值作为组标题-这样仅显示一次;然后在其下面列出所有许多记录。

这本身并不是一个列表框,尽管它取决于报表/子报表的创造性,一个人可能会采用这种样式。但是最后,您必须在表示层上进行操作。

答案 1 :(得分:0)

一种方法是使用exists

select g.*
from genres as g
where exists (select 1
              from showgenres as sg inner join
                   shows as s
                   on sg.showID = s.showID
              where sg.genreID = g.genreID and
                    s.showName = ?
             );