2016-11-18 2 views
4

Я понимаю, что эта задача должна быть довольно простой, но по какой-то причине я не могу понять ее в течение некоторого времени. Поиск подобных проблем тоже не помог.T-SQL: как заполнить столбец с помощью отдела пользователя?

Так, скажем, у меня есть две таблицы: Документы и DepartmentsAndUsers.

--- Documents --- (one document could have any user as its author) 
DocumentID AuthorID DepartemntID 
1   User1  null 
2   User2  null 
3   User3  null 
4   User1  null 
5   User4  null 

--- DepartmentsAndUsers --- (a user could be in any number of departments) 
DepartmentID UserID 
Dept1   User1 
Dept1   User2 
Dept1   User3 
Dept2   User4 
Dept2   User5 
Dept3   User1 
Dept3   User3 

Как заполнить DepartemntID колонку в Документы таблицы с первым (или) отделов пользователя находится в DepartmentsAndUsers таблицы?

К примеру, User1 в dept1 и в Dept3 так DepartmentID для Документы 1 и 4 должны быть заполнены значениями dept1 или Dept3.

Пожалуйста, не думайте об этом из точки нормализации, поскольку я не могу изменить какую-либо логику таблиц.

Любая помощь или ссылка на какое-то решение с таким же сценарием будет высоко оценена.

+0

Поскольку пользователь может находиться в нескольких отделах, делает это независимо от того, какой из них вы положили в таблицах документов ? Для User1, могут ли они ВСЕ сказать Dept1? Это легко сделать. В противном случае нет реального способа определить, какие документы должны получить «Dept1» или «Dept3» – pmbAustin

+0

Это не имеет значения. Любой из дел будет делать. –

+0

Это зависит от того, хотите ли вы в той же строке или если несколько строк в порядке. Если это последнее, тогда будет работать простое соединение. В противном случае вам понадобится динамический стержень или составьте список отделов в один столбец. – scsimon

ответ

3
with cte as( 
    select 
     UserID, 
     max(DepartmentID) as DepartmentID 
    from DepartmentsAndUsers 
    group by UserID) 

select 
    d.DocumentID, 
    d.AuthorID, 
    cte.DepartmentID 
from Documents d 
inner join cte on cte.UserID = d.AuthorID 
+0

Этот запрос будет выбирать данные, и мне нужно обновить значения в существующей таблице, например: update Documents set DepartemntID = ??? –

+1

Я получил его сейчас! Это использование общего выражения таблицы было именно тем, что мне нужно. Со всем выражением, которое вы написали, я теперь могу присоединиться к моей таблице Documents к вашему выражению выделения с помощью «on Documents.ID = Selection.ID», а затем просто сказать «set Documents.DepartemntID = Selection.DepartemntID». Большое спасибо! –

+0

Не стоит беспокоиться – scsimon

1

Это также должно работать:

UPDATE Documents SET DepartemntID = E.DepartemntID 
FROM Documents D 
LEFT JOIN (
    SELECT UserID, MIN(DepartemntID) DepartemntID 
    FROM DepartmentsAndUsers 
    GROUP BY UserID 
) E ON E.UserID = D.AuthorID 

Вот пример:

DECLARE @Documents TABLE (
    DocumentID INT, 
    AuthorID VARCHAR(16), 
    DepartemntID VARCHAR(16) 
) 

DECLARE @DepartmentsAndUsers TABLE (
    DepartemntID VARCHAR(16), 
    UserID VARCHAR(16) 
) 

INSERT @Documents VALUES 
(1, 'User1', NULL), 
(2, 'User2', NULL), 
(3, 'User3', NULL), 
(4, 'User1', NULL), 
(5, 'User4', NULL) 

INSERT @DepartmentsAndUsers VALUES 
('Dept1', 'User1'), 
('Dept1', 'User2'), 
('Dept1', 'User3'), 
('Dept2', 'User4'), 
('Dept2', 'User5'), 
('Dept3', 'User1'), 
('Dept3', 'User3') 

UPDATE @Documents SET DepartemntID = E.DepartemntID 
FROM @Documents D 
LEFT JOIN (
    SELECT UserID, MIN(DepartemntID) DepartemntID 
    FROM @DepartmentsAndUsers 
    GROUP BY UserID 
) E ON E.UserID = D.AuthorID 

SELECT * FROM @Documents 
Смежные вопросы