SQL JOIN显示的结果超出了它应该显示的结果

时间:2015-12-30 06:18:00

标签: sql

我有一个简单的问题,我相信很多人可以相对容易地回答。我已经阅读了几个关于这个主题的网站和以前的问题,我仍然感到困惑。我是新手,但很快就学习......

我的两张桌子:

表1:排名:

Rank firstinitial LastName Pos Team
51  A   Ellington   RB  ARI
78  M   Floyd   WR  ARI
85  L   Fitzgerald  WR  ARI
86  J   Brown   WR  ARI
107 D   Johnson RB  ARI
147 A   Cardinals   DST ARI
180 C   Palmer  QB  ARI
205 C   Johnson RB  ARI
223 C   Catanzaro   K   ARI
288 S   Taylor  RB  ARI

表2:深度:

Team pos pos2 firstinitial lastname
ARI K   K1  C   Catanzaro
ARI QB  QB1 C   Palmer
ARI QB  QB2 D   Stanton
ARI QB  QB3 M   Barkley
ARI RB  RB1 C   Johnson
ARI RB  RB2 A   Ellington
ARI RB  RB3 D   Johnson
ARI RB  RB4 S   Taylor
ARI RB  RB5 K   Williams
ARI TE  TE1 D   Fells
ARI TE  TE2 J   Gresham
ARI TE  TE3 T   Niklas
ARI TE  TE4 G   Christian
ARI WR  WR1 L   Fitzgerald
ARI WR  WR2 M   Floyd
ARI WR  WR3 J   Brown
ARI WR  WR5 J   Nelson
ARI WR  WR6 B   Golden

SQL代码:

SELECT DISTINCT
       [r].[Rank]
      ,[d].[firstinitial] + '.' + [d].[LastName] as Fullname2
      ,[r].[Team]
      ,[r].[Bye]
      ,[r].[Pos]
      ,[d].[pos2]
FROM [football].[dbo].[rank] [r]
inner join [football].[dbo].[depth] [d] on [d].[firstinitial] + [d].[LastName] = [r].[firstinitial] + [r].[LastName]
where [d].[pos2] IS NOT NULL
and [r].[Pos] = [d].[pos]
order by [r].[Team], [d].[pos2]

结果:

Rank Fullname2 Team Bye Pos pos2
223 C.Catanzaro ARI 9   K   K1
180 C.Palmer    ARI 9   QB  QB1
205 C.Johnson   ARI 9   RB  RB1
107 D.Johnson   ARI 9   RB  RB2
51  A.Ellington ARI 9   RB  RB2
107 D.Johnson   ARI 9   RB  RB3
288 S.Taylor    ARI 9   RB  RB4
85  L.Fitzgerald ARI 9  WR  WR1
78  M.Floyd ARI 9   WR  WR2
78  M.Floyd ARI 9   WR  WR3
86  J.Brown ARI 9   WR  WR3
86  J.Brown ARI 9   WR  WR4

问题:

在这个例子中,'RB2'位置(在'pos2'下)在两个不同的个体的结果中显示两次。但是,如果我们查看表格,我们会看到'A.Ellington'应该是'pos2'中列为'RB2'的唯一人。我不确定加入时我缺少什么。期望的结果将显示唯一的行,没有重复。

请帮助并解释正确的过程。谢谢!

1 个答案:

答案 0 :(得分:0)

我看不出具体是什么导致了你的问题,但我看错了。你的加入应该包括团队,你加入连接的字符串;你应该简单地将列与列匹配。

SELECT DISTINCT
       [r].[Rank]
      ,[d].[firstinitial] + '.' + [d].[LastName] as Fullname2
      ,[r].[Team]
      ,[r].[Bye]
      ,[r].[Pos]
      ,[d].[pos2]
FROM [football].[dbo].[rank] [r]
inner join [football].[dbo].[depth] [d] on [r].[Team]=[d].[Team]
    AND [d].[firstinitial] = [r].[firstinitial]
    AND [d].[LastName] = [r].[LastName]
    AND [r].[Pos] = [d].[pos]
where [d].[pos2] IS NOT NULL
order by [r].[Team], [d].[pos2]