Sql 用另一个表中的值替换id

Sql 用另一个表中的值替换id,sql,select,Sql,Select,我有两张桌子: Table Users UserId Name 1 John 2 Alice 3 Tom 4 Charles 及 我想在何处进行SQL查询 Clients.Id = 1 结果如下: Id Name1 Name2 Name3 1 John Tom Charles 使用内部联接,我可以对客户端的每一

我有两张桌子:

Table Users

UserId     Name
1          John
2          Alice
3          Tom
4          Charles

我想在何处进行SQL查询

Clients.Id = 1
结果如下:


Id         Name1          Name2       Name3
1          John            Tom       Charles

使用内部联接,我可以对客户端的每一列执行此操作,但不能对整个记录(所有三列)执行此操作。

您需要在表
客户端上联接表
用户
三次

SELECT  a.ID,
        b.name name1,
        c.name name2,
        d.name name3
FROM    clients a
        INNER JOIN users b
            ON a.name1 = b.userID
        INNER JOIN users c
            ON a.name2 = c.userID
        INNER JOIN users d
            ON a.name3 = d.userID
WHERE   a.ID = 1

您需要为每个名称加入一次Users表。如果您有3个列,那么可能有一个或多个列可以为null,因此您更可能需要左连接而不是内部连接

   select c.id, u1.name name1, u2.name name2, u3.name name3
     from Clients c
left join Users u1 on u1.UserId = c.name1
left join Users u2 on u2.UserId = c.name2
left join Users u3 on u3.UserId = c.name3
    where c.Id = 1

还有一个不需要过度连接的选项

SELECT c.Id, MAX(CASE WHEN u.UserID = c.Name1 THEN u.Name END) AS Name1,
             MAX(CASE WHEN u.UserID = c.Name2 THEN u.Name END) AS Name2,
             MAX(CASE WHEN u.UserID = c.Name3 THEN u.Name END) AS Name3
FROM dbo.Users u JOIN dbo.Clients c ON u.UserId IN (c.Name1, c.Name2, c.Name3)
WHERE c.Id = 1
GROUP BY c.Id

您应该做的是规范化数据结构。那就不会这么痛苦了。
SELECT c.Id, MAX(CASE WHEN u.UserID = c.Name1 THEN u.Name END) AS Name1,
             MAX(CASE WHEN u.UserID = c.Name2 THEN u.Name END) AS Name2,
             MAX(CASE WHEN u.UserID = c.Name3 THEN u.Name END) AS Name3
FROM dbo.Users u JOIN dbo.Clients c ON u.UserId IN (c.Name1, c.Name2, c.Name3)
WHERE c.Id = 1
GROUP BY c.Id