2015-12-10 152 views
0

我目前正在处理一个查询,我需要提取项目列表,以及它们输入系统的日期以及输入项目的人员的姓名和用户ID。SQL:在一个查询中选择相同的列两次?

Items表包含列CreateDateCreatedBy(这是人的用户ID),LastChanged(这是一个日期),并LastChangedBy(也有用户ID,是因为谁进入该项目的人并不总是创造它的同一个人)。

我已将Items表与用户表连接起来,这样我就可以拉出与CreatedByLastChangedBy用户标识匹配的用户的名字和姓氏。我现在已经查询了这个查询的方式,我将这两个字段连接在一起,以便在单个列中显示为“姓氏,名字”。我也想只为某个用户提供结果,而这个用户只需要成为最后一个更改项目的人 - 无论他们是否创建它都没关系。

我的查询看起来是这样的:

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; 

我的问题是,虽然,因为我有完全相同的一段代码来拉用户的名字两次,它拉动的同名无论用户CreatedByLastChangedBy列中的ID不同。所以,我最终的结果是这样的:

ItemName  CreateDate  Created By Name CreatedBy LastChanged Last Changed By Name LastChangedBy 

Item A  12/01/2015  Smith, John  0001   12/03/2015  Smith, John    0001 
Item B  12/02/2015  Smith, John  0001   12/04/2015  Smith, John    0001 
Item C  12/02/2015  Doe, Jane   1002   12/05/2015  Doe, Jane    0001 

所以即使约翰·史密斯是最后一个人改变项目C,它仍然存在显示Jane Doe的名字,因为(我认为)的代码串显示用户的名字在两个实例中都是相同的,并且只是两次拉同名。

是否有办法在同一个查询中两次从用户表中拉取姓氏和名字,但要确保它们与正确的用户ID相对应?

回答

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; 

你需要参加两次获得两个用户。

+0

啊,完美!那就是诀窍。 – EJF

相关问题