SQL:在一个查询中两次选择相同的列?

时间:2015-12-10 19:48:52

标签: sql sql-server

我正在进行查询,我需要提取一个项目列表,以及它们输入系统的日期以及输入项目的人员的姓名和用户ID。

我的Items表包含列CreateDateCreatedBy(这是此用户的用户ID),LastChanged(这是日期)和{{1} (也是用户ID,就像输入项目的人并不总是创建它的人一样)。

我将Items表与User表连接,因此我可以提取与LastChangedByCreatedBy用户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相对应?

1 个答案:

答案 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;

您需要加入两次才能吸引两位用户。