我如何加入这两张桌子?

时间:2012-10-12 19:00:23

标签: sql-server tsql

我在SQL Server中有两个表:

enter image description here

现在我想编写一个select语句来连接这两个表来获取MatchIdHost nameGuest name

我尝试了什么:

select Match.Id, Team.Name, Team.Name 
from Match 
join Team on Match.HostId = Team.Id

我的主机名和客人名称相同。

select Match.Id, Team.Name, Team.Name 
from Match 
join Team on Match.HostId = Team.Id 
join Team on Match.GuestId = Team.Id

我收到了错误。

请帮忙!

4 个答案:

答案 0 :(得分:3)

您需要查看simple joins

SELECT m.Id AS MatchId, h.Name AS HostName, g.Name AS GuestName
FROM Match AS m
INNER JOIN Team AS h ON m.HostId = h.Id
INNER JOIN Team AS g ON m.GuestId = g.Id

您需要将Match表的HostId和GuestId分别加入Team表,以获取每个团队的名称。我使用了别名来防止你在第二次尝试中看到的错误。

答案 1 :(得分:3)

你只需要加入桌子两次:<​​/ p>

select m.id MatchId, 
   h.name HostName, 
   g.name GuestName
from match m
left join team h
  on m.hostid = h.id
left join team g
  on m.guestid = g.id

答案 2 :(得分:0)

假设ID用于链接两个表中的记录(即,虽然它是两个表上的主键,但它也被用作外键):

select m.HostId, m.GuestId, t.Name 
from Match m
left outer join Team t
    on m.id = t.id

如果ID不相同,您可以执行以下操作以使所有团队与所有匹配项匹配:

select m.HostId, m.GuestId, t.Name 
from Match m
cross join Team t

如果这不是你所追求的,你可能需要在其中一个表中添加一个外键,或者创建一个带有MatchId和TeamId的新表来链接这两个表,然后加入那个

create table MatchTeam
(
    MatchId bigint not null
    ,TeamId bigint not null
)

go

select m.HostId, m.GuestId, t.Name 
from Match m
left outer join MatchTeam mt
    on m.Id = mt.MatchId
left outer join Team t
    on mt.TeamId = t.id

如果hostid和guestid与团队表相关:

select m.id MatchId
, h.Name HostName
, g.Name GuestName 
from Match m
left outer join Team h
    on m.HostId = h.id
left outer join Team g
    on m.GuestId = h.id

答案 3 :(得分:0)

您收到错误的原因是因为Match是SQL中的关键字,因此您需要使用'Match'或使用表的其他名称对其进行转义。

我将接受Adam的查询并根据您的需要进行修改:

SELECT m.Id AS MatchId, h.Name AS HostName, g.Name AS GuestName
FROM `Match` AS m
INNER JOIN Team AS h ON m.HostId = h.Id
INNER JOIN Team AS g ON m.GuestId = g.Id