2012-10-02 3 views
2

У меня есть две таблицы:Заменяет идентификатор со значением из другой таблицы

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 столбца, вероятно, один или несколько могут быть обнуляемыми, поэтому вы, скорее всего, захотите ЛЕВОЕ СОЕДИНЕНИЕ, чем INNER JOIN.

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 
Смежные вопросы