使用 SQL 将表与联结表连接起来

Posted

技术标签:

【中文标题】使用 SQL 将表与联结表连接起来【英文标题】:Using SQL to join tables with a junction table 【发布时间】:2016-03-04 02:25:24 【问题描述】:

我正在尝试从我的数据库中的 2 个不同的表中输出数据,这些表由一个联结表连接。

Table 1: musician
Columns: musicianID, surname, fName

Table 2: musician_band
Columns: musicianID, bandID

Table 3: band
Columns: bandID, bandName, genre, yearFormed, origin

刚开始我想输出:

fName, bandName

我尝试使用此查询:

SELECT DISTINCT fName, bandName
FROM musician_band
JOIN musician ON musician.musicianID = musician_band.musicianID
JOIN band ON band.bandID = band.bandID

但不是给我一个音乐家列表和他们所在的乐队,而是重复数据库中第一位音乐家的名字,然后是右边的乐队名称,每个乐队都重复这个在数据库中,即使该特定音乐家和乐队之间不应该存在关系。像这样:

fname         bandName
musician1     band1
musician1     band2
musician1     band3
musician2     band1
musician2     band2
musician2     band3

等等……

如何更正此问题,使其仅输出正确乐队中的音乐家?

【问题讨论】:

您的查询没有问题。它正在给你它应该得到的东西。您的数据是错误的,如果关系不存在,则无法与您的查询一起返回关系。任何表格中是否有任何字段显示“这是正确的波段”或“实际波段”。你的关系是 N->M,所以一个音乐家可以同时在多个乐队。 另外,添加应该是正确的输出。你想要的。 在 band.bandID = band.bandID ummm 上加入乐队 @JorgeCampos 我认为你错了 @Strawberry 哦,你是对的,我错了!错过了错误的加入!我只是假设它是音乐家乐队的乐队!谢谢!! 【参考方案1】:

您的别名有问题。您需要为 JOIN 中的每个引用表提供不同的别名:

这个示例查询可以正常工作:

SELECT DISTINCT fName, bandName
FROM @musician_band mb
JOIN @musician m ON m.musicianID = mb.musicianID
JOIN @band b ON mb.bandID = b.bandID

在 SQL Server 中使用此示例:

declare @musician table(musicianID int, surname varchar(50), fName varchar(50));
insert into @musician(musicianID, surname, fName
) values
( 1, 'Pete Doherty', 'Pete Doherty')
, ( 2, 'Damon Albarn', 'Damon Albarn')

declare @musician_band table(musicianID int, bandID int);
insert into @musician_band(musicianID, bandID) values
(1, 1)
, (1, 2)
, (2, 3)
, (2, 4)

declare @band table(bandID int, bandName varchar(50), genre varchar(50), yearFormed int, origin varchar(50));
insert into @band(bandID, bandName, genre, yearFormed, origin
) values
( 1, 'The Libertines', '', 0, '')
, (2, 'Babyshambles', '', 0, '')
, (3, 'Blur', '', 0, '')
, (4, 'Gorillaz', '', 0, '')

输出是:

fName           bandName
Damon Albarn    Blur
Damon Albarn    Gorillaz
Pete Doherty    Babyshambles
Pete Doherty    The Libertines

只需将@tablename 替换为您自己的表即可。 DISTINCT 在这种情况下有用吗?

【讨论】:

【参考方案2】:

你没有正确加入你的表

JOIN band ON band.bandID = band.bandID

将获得带中每一行的 1 行。

试试这个:

SELECT DISTINCT fName, bandName
FROM musician_band
JOIN musician ON musician.musicianID = musician_band.musicianID
JOIN band ON band.bandID = musician_band.bandID

您甚至可以使用此解决方案删除关键字 DISTINCT

【讨论】:

谢谢,看来我错过了错误

以上是关于使用 SQL 将表与联结表连接起来的主要内容,如果未能解决你的问题,请参考以下文章

如何将表与中间表和附加相关列spring hibernate mvc连接起来

将表与自身连接 SQL

SQL - 将聚合表与非聚合表连接起来

Oracle SQL 将日期维度表与另一个关于日期值的表连接起来

如何在 LINQ sql 中将两个表与一个具有不同值的表连接起来?

如何将 html 风格化表与 php 和 sql 连接起来