Результат Соединение нескольких столбцов с общим идентификатором - PullRequest
0 голосов
/ 26 октября 2018

Я в конечном итоге пытаюсь построить представление

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

Table A 
ID,Username

Table B 
Date ,User ID , Modified UserID , Created User ID,INVtotal,InVDesc

Select a.Username,Date ,User ID , Modified UserID , Created User ID,INVtotal,InVDesc
   from Table B
   join 
   Table A  on a.ID = User ID

Вышеприведенное дает мне хороший результат, но я хотел бы, чтобы имя пользователя, а не идентификатор отображалось в столбцах «Измененный идентификатор пользователя», «Созданный пользователь», поскольку они могут различаться при изменении.

Спасибо

Пример данных

ID  Username                
1   May                 
2   Jon             
3   Sam             
4   Eric                

Date      UserID    ModifedUserID   CreatedUserID   INVTotal InVDesc
26/10/2018  1        2                 1             100    A123
26/10/2018  1        3                 1             200    A124
26/10/2018  2        4                 2             100    A125
26/10/2018  2                          2             200    A126
26/10/2018  4        1                 4             100    A127
26/10/2018  3        1                 3             200    A128

Ожидаемый результат

Date        UserID   ModifedUserID  CreatedUserID    INVTotal   InVDesc
26/10/2018  May      Jon            May              100    A123

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Вот, пожалуйста,

CREATE TABLE T1
    ([ID] int, [Username] varchar(4))
;

INSERT INTO T1
    ([ID], [Username])
VALUES
    (1, 'May'),
    (2, 'Jon'),
    (3, 'Sam'),
    (4, 'Eric')
;


CREATE TABLE T2
    ([Date] varchar(10), [UserID] int, [ModifedUserID] int, [CreatedUserID] int, [INVTotal InVDesc] varchar(8))
;

INSERT INTO T2
    ([Date], [UserID], [ModifedUserID], [CreatedUserID], [INVTotal InVDesc])
VALUES
    ('26/10/2018', 1, 2, 1, '100 A123'),
    ('26/10/2018', 1, 3, 1, '200 A124'),
    ('26/10/2018', 2, 4, 2, '100 A125'),
    ('26/10/2018', 2, 2, 200, 'A126'),
    ('26/10/2018', 4, 1, 4, '100 A127'),
    ('26/10/2018', 3, 1, 3, '200 A128')
;

SELECT T1.UserName,
       T11.UserName As ModifiedBy,
       T111.UserName As CreatedBy,
       T2.[Date],
       T2.[INVTotal InVDesc]
FROM T1 INNER JOIN T2 ON T1.ID = T2.UserID
        INNER JOIN T1 T11 ON T2.ModifedUserID = T11.ID
        INNER JOIN T1 T111 ON T2.CreatedUserID = T111.ID
WHERE T2.ModifedUserID = 2;
0 голосов
/ 26 октября 2018

Уже есть два доступных решения с использованием JOIN , как указано выше, но я публикую здесь другое решение - с помощью FUNCTION .

Создать пользовательскую функцию, которая возвращает имя пользователя на основе предоставленного идентификатора пользователя.

CREATE FUNCTION dbo.ufn_GetUserName (@userID INT)
RETURNS VARCHAR(10)
AS
BEGIN
     DECLARE @username VARCHAR(10) = ''
     SELECT @username = Username FROM TableA WHERE ID = @userID
     RETURN @username
END

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

SELECT 
    DATE,
    dbo.ufn_GetUserName(UserID) AS UserID,
    dbo.ufn_GetUserName(ModifiedUserID) AS ModifiedUserID, 
    dbo.ufn_GetUserName(CreatedUserID) AS CreatedUserID,
    INVtotal,
    InVDesc
FROM TableB

Спасибо, Sandy

0 голосов
/ 26 октября 2018

Надеюсь, я вас правильно понял

SELECT
  b.Date,
  --b.UserID,
  u1.Username,
  --b.ModifiedUserID,
  u2.Username ModifiedUsername,
  --b.CreatedUserID,
  u3.Username CreatedUsername,
  b.INVtotal,
  b.InVDesc
FROM TableB b
JOIN TableA u1 ON b.UserID=u1.ID
LEFT JOIN TableA u2 ON b.ModifiedUserID=u2.ID
LEFT JOIN TableA u3 ON b.CreatedUserID=u3.ID

Если b.UserID может быть NULL, то вам также нужно использовать LEFT JOIN для TableA u1.

...