2012-10-02 67 views
2

值我有两个表:替换ID与另一个表

Table Users 

UserId  Name 
1   John 
2   Alice 
3   Tom 
4   Charles 

Table Clients 

Id   Name1   Name2  Name3 
1   1    3   4 
2   2    1   3 

我想作一个SQL查询,其中用于

Clients.Id = 1 

结果如下:


Id   Name1   Name2  Name3 
1   John   Tom  Charles 

使用INNER JOIN我能够为客户端的每个列做到这一点,但不能为整个记录(全部三列)做到这一点。 谢谢。

+0

你应该做的是规范你的数据结构多了一个选择。那么这不会是那么痛苦。 – podiluska

回答

5

您需要加入表users三次client

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 

SQLFiddle Demo

1

你需要加入到用户表一次为每个名字。鉴于你有3列,它可能是一个或多个可能为空,所以你更可能想要内联接比左联接。

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 
+0

谢谢!两者都在工作!再次感谢你! –

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