SQL присоединяет одну таблицу к нескольким столбцам

#sql #sql-server #database #join

#sql #sql-сервер #База данных #Присоединиться

Вопрос:

У меня в моей БД 2 таблицы

1) Таблица отчета

  AppNo AppName AddedBy AssignedTo ModifiedBy
 -------------------------------------------
    1   App1       1        2           1      
    2   App2       1        2           2
    3   App3       2        2           2
    4   App4       1        2           3
  

2) Таблица пользователей

    UserId  UserName Role
   ----------------------
    1     Raj      Manager
    2     Sid      Lead
    3     KK       Rep
  

Итак, я хочу объединить две таблицы, чтобы я мог получать имена вместо идентификаторов

Требуется результат:

   AppNo AppName AddedBy AssignedTo ModifiedBy
  -------------------------------------------
    1   App1     Raj      Sid          Raj      
    2   App2     Raj      Sid          Sid
    3   App3     Sid      Sid          Sid
    4   App4     Raj      Sid           KK
  

Мой запрос:

 SELECT
R.AppNo, R.AppName,
u1.UserName as AddedBy,
u2.UserName as AssignedTo,
u3.UserName as ModifiedBy

FROM Report R

LEFT OUTER JOIN Users u1 on u1.UserID = R.AddedBy
LEFT OUTER JOIN Users u2 on u2.UserID = R.AssignedTo
LEFT OUTER JOIN Users u3 on u3.UserID = R.ModifiedBy
  

Но я не хочу присоединяться к пользовательской таблице несколько раз..

Как и в моей исходной таблице отчетов, там есть почти 8 столбцов userId, поэтому я не могу присоединиться к 8 раз, это снижает производительность.

Кто-нибудь может предложить лучший способ.

Примечание: я не могу изменить схему таблицы

Заранее спасибо

Ответ №1:

Единственный способ — многократное объединение; это и есть данные и структура.

Проблем с производительностью быть не должно, поскольку база данных обычно хорошо спроектирована для этого. То, что соединение выглядит сложным для людей, не означает, что оно сложное или дорогостоящее для оптимизатора или базы данных.

Ответ №2:

Для столбцов можно использовать декартово объединение, хотя производительность будет сильно зависеть от того, насколько хорошо проиндексированы таблицы…

 select R.AppNo,
       R.AppName,
       (select UserName from Users where UserID = R.AddedBy) as AddedBy,
       (select UserName from Users where UserID = R.AssignedTo) as AssignedTo,
       (select UserName from Users where UserID = R.ModifiedBy) as ModifiedBy
from Report R