使用 SQL 将 table 与结点 table 连接起来
Using SQL to join tables with a junction table
我正在尝试从我的数据库中的 2 个不同的 table 输出数据,这两个 table 由连接点 table.
连接
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
等...
如何更正此问题,使其只输出正确乐队的音乐家?
您没有正确加入表格
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
您的别名有问题。您需要为 JOIN:
中每个引用的 table 设置不同的别名
此示例查询可以正常工作:
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 服务器中使用此示例:
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 替换为您自己的 table。 DISTINCT
在这种情况下有用吗?
假设您想要包括独唱音乐家:
select fName, bandName
from musician m
left join musician_band mb on mb.musicianID = m.musicianID
inner join band b on b.bandID = mb.bandID
order by fName, bandName
即使您保留内连接而不是左连接,从概念上讲,查询从音乐家 table 开始仍然是理想的,而不是 musician_band。如果您想要每个乐队的音乐家,则 table 顺序将相反。无论哪种方式,从结点 table.
开始都是没有逻辑的
每个音乐家多行是预期的结果。
如果你想要这个:
fName bandName
musician1 band1, band2, band3
musician2 band1, band2, band3
这需要一个存储过程或您的应用程序代码循环查询以构建您想要的数据结构以输出给用户。
我正在尝试从我的数据库中的 2 个不同的 table 输出数据,这两个 table 由连接点 table.
连接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
等...
如何更正此问题,使其只输出正确乐队的音乐家?
您没有正确加入表格
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
您的别名有问题。您需要为 JOIN:
中每个引用的 table 设置不同的别名此示例查询可以正常工作:
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 服务器中使用此示例:
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 替换为您自己的 table。 DISTINCT
在这种情况下有用吗?
假设您想要包括独唱音乐家:
select fName, bandName
from musician m
left join musician_band mb on mb.musicianID = m.musicianID
inner join band b on b.bandID = mb.bandID
order by fName, bandName
即使您保留内连接而不是左连接,从概念上讲,查询从音乐家 table 开始仍然是理想的,而不是 musician_band。如果您想要每个乐队的音乐家,则 table 顺序将相反。无论哪种方式,从结点 table.
开始都是没有逻辑的每个音乐家多行是预期的结果。
如果你想要这个:
fName bandName
musician1 band1, band2, band3
musician2 band1, band2, band3
这需要一个存储过程或您的应用程序代码循环查询以构建您想要的数据结构以输出给用户。