我正在进行查询,我需要提取一个项目列表,以及它们输入系统的日期以及输入项目的人员的姓名和用户ID。
我的Items
表包含列CreateDate
,CreatedBy
(这是此用户的用户ID),LastChanged
(这是日期)和{{1} (也是用户ID,就像输入项目的人并不总是创建它的人一样)。
我将Items表与User表连接,因此我可以提取与LastChangedBy
和CreatedBy
用户ID匹配的用户的名字和姓氏。我现在编写查询的方式,我已经连接了两个字段,因此它们最终在一列中显示为“ LastName,FirstName ”。我还想只为某个用户提取结果,而这个用户只需要是最后一个更改项目的人 - 无论他们是否创建了这个项目。
我的查询看起来像这样:
LastChangedBy
我的问题是,因为我有完全相同的代码片段来同时提取用户名,所以无论SELECT
i.ItemName, i.CreateDate,
(u.LastName + ', ' + u.FirstName) as [Created By Name],
i.CreatedBy, i.LastChanged,
(u.LastName + ', ' + u.FirstName) as [Last Changed By Name],
i.LastChangedBy
FROM
Items i
JOIN
Users u ON i.CreatedBy = u.UserID
WHERE
i.LastChangedBy = 0001;
和{{1}中的用户ID是否不同,它都会提取相同的名称} 列。所以我最终得到的结果如下:
CreatedBy
所以即使约翰史密斯是最后一个改变项目C的人,它仍然在那里显示Jane Doe的名字,因为(我假设)显示用户名字的代码串在两个实例中是相同的,它只是拉动它两次命名。
有没有办法在同一个查询中两次从User表中提取名字和姓氏,但要确保它们与正确的用户ID相对应?
答案 0 :(得分:3)
我认为您在查询中遗漏了join
:
SELECT i.ItemName, i.CreateDate,
(uc.LastName + ', ' + uc.FirstName) as [Created By Name],
i.CreatedBy, i.LastChanged,
(ucb.LastName + ', ' + ucb.FirstName) as [Last Changed By Name],
i.LastChangedBy
FROM Items i LEFT JOIN
Users uc
ON i.CreatedBy = uc.UserID LEFT JOIN
Users ucb
ON i.LastChangedBy = ucb.UserId
WHERE i.LastChangedBy = 0001;
您需要加入两次才能吸引两位用户。