2016-11-18 15 views
4

私はこの作業がかなりシンプルでなければならないことを認識していますが、何らかの理由でしばらく考えられません。同様の問題を検索しても役に立たなかった。T-SQL:ユーザーの部門に列を入力する方法は?

私は2つのテーブルがあるとします:DepartmentsAndUsersです。 DepartmentsAndUsersテーブルに配置されたユーザの部門の私は、最初の(または任意の)で文書テーブルでDepartemntID列を埋めるにはどうすればよい

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

例えば、User1はそう文献 1および4のがDEPT1又はDept3値で埋めなければならないDepartmentIdのDEPT1およびDept3です。

テーブルのロジックを変更できないので、正規化ポイントからこれを考えないでください。

同じシナリオで解決されたソリューションへのヘルプやリンクは高く評価されます。

+0

、ユーザが複数の部門にすることができますので、あなたが文書テーブルに置かれた1かまいありません? User1にとって、彼らはすべてDept1と言うことができますか?それは簡単です。そうでなければ、 "Dept1"または "Dept3"を取得する文書を特定する実際の方法はありません – pmbAustin

+0

それは問題ではありません。部署のいずれかが行います。 –

+0

これは、同じ行に置くか、複数の行が大丈夫かどうかによって異なります。後者の場合、単純な結合が機能します。それ以外の場合は、動的なピボットが必要です。または、部門のリストを1つの列に入れてください。 – 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

このクエリはデータを選択し、既存のテーブルの値を更新する必要があります:更新ドキュメントセットDepartemntID = ??? –

+1

私はそれを今得ました!これは、共通のテーブル表現を使用することは、まさに私が必要としていたものでしたあなたが書いた全体の表現で、私は今あなたの選択式に "Documents.Did = Selection.ID"で私のDocumentsテーブルに参加して、ちょうど "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 
関連する問題