Sql 尝试引用另一列以使用联接使用匹配数据填充新列

Sql 尝试引用另一列以使用联接使用匹配数据填充新列,sql,sql-server,self-join,Sql,Sql Server,Self Join,对不起,我在这方面还是新手,所以我可能错过了一些相当简单的东西。我的问题是,我如何将队长的名字提取到一个新的专栏中,以匹配球队(如大卫·福尼尔和马林鱼)?我觉得我错过了一些简单的自我连接。任何帮助都将不胜感激 这是我的第一个问题 SELECT b.BowlerID, concat (b.BowlerFirstName,' ',b.BowlerLastName) 'Bowler's Name', t.TeamName, t.CaptainID FROM B

对不起,我在这方面还是新手,所以我可能错过了一些相当简单的东西。我的问题是,我如何将队长的名字提取到一个新的专栏中,以匹配球队(如大卫·福尼尔和马林鱼)?我觉得我错过了一些简单的自我连接。任何帮助都将不胜感激

这是我的第一个问题

SELECT 
    b.BowlerID, 
    concat (b.BowlerFirstName,'  ',b.BowlerLastName) 'Bowler's Name', 
    t.TeamName, 
    t.CaptainID
FROM Bowlers as b
INNER JOIN Teams as t ON b.TeamID = t.TeamID
结果是

BowlerID   Bowler's Name           TeamName    CaptainID
1          Barbara Fournier        Marlins       2
2          David Fournier          Marlins       2
3          John Kennedy            Marlins       2
4          Sara Sheskey            Marlins       2
5          Ann Patterson           Sharks        5
6          Neil Patterson          Sharks        5
7          David Viescas           Sharks        5
8          Stephanie Viescas       Sharks        5
我又问了一个问题

SELECT 
    b.BowlerID, 
    concat (b.BowlerFirstName,'  ',b.BowlerLastName) 'Team Captain', 
    t.TeamName
FROM Bowlers as b
INNER JOIN Teams as t ON b.BowlerID = t.CaptainID
给我这个

BowlerID    Team Captain      TeamName
2           David Fournier    Marlins
5           Ann Patterson     Sharks

似乎可以通过条件聚合和窗口函数来实现这一点:

MAX(
    CASE WHEN T.CaptainID = B.BowlerID 
        THEN CONCAT(B.BowlerFirstName,'  ',B.BowlerLastName) 
    END
) OVER (PARTITION BY T.TeamID)

似乎可以通过条件聚合和窗口函数来实现这一点:

MAX(
    CASE WHEN T.CaptainID = B.BowlerID 
        THEN CONCAT(B.BowlerFirstName,'  ',B.BowlerLastName) 
    END
) OVER (PARTITION BY T.TeamID)

您可以再次加入
保龄球运动员
以获得队长姓名:

SELECT 
    b.BowlerID, 
    CONCAT(b.BowlerFirstName, ' ', b.BowlerLastName) [Bowler Name], 
    t.TeamName, 
    t.CaptainID,
    CONCAT(c.BowlerFirstName, ' ', c.BowlerLastName) [Captain Name]
FROM Bowlers as b
INNER JOIN Teams as t ON b.TeamID = t.TeamID
INNER JOIN Bowlers as c ON  c.BowlerID = t.CaptainID

注意:在SQL server中,最好使用方括号(
[]
)来引用标识符;单引号通常保留给随行人员。

您可以再次加入
保龄球运动员
以获得队长姓名:

SELECT 
    b.BowlerID, 
    CONCAT(b.BowlerFirstName, ' ', b.BowlerLastName) [Bowler Name], 
    t.TeamName, 
    t.CaptainID,
    CONCAT(c.BowlerFirstName, ' ', c.BowlerLastName) [Captain Name]
FROM Bowlers as b
INNER JOIN Teams as t ON b.TeamID = t.TeamID
INNER JOIN Bowlers as c ON  c.BowlerID = t.CaptainID

注意:在SQL server中,最好使用方括号(
[]
)来引用标识符;单引号通常是保留给字符串的。只要使用表别名,就可以多次连接同一个表。

只要使用表别名,就可以多次连接同一个表。我真希望Microsoft不赞成使用所有字符串文字别名,而不仅仅是
'Alias'={Expression}
@Larnu:确实。。。我认为SQL Server是最后一个允许这样做的RDBMS之一…该死,我以为我试过了,但我觉得我很傻,错过了。谢谢!谢谢括号里的提示。我真的希望微软不推荐所有字符串文字别名,而不仅仅是
'Alias'={Expression}
@Larnu:的确。。。我认为SQL Server是最后一个允许这样做的RDBMS之一…该死,我以为我试过了,但我觉得我很傻,错过了。谢谢!谢谢你在支架上的提示。