SQL查询-将同一列联接两次
我很难获得想要的结果,我想尝试两次从表中联接一列 我的第一个表是“dbo.Sessions”,它包含基本会话信息,如用户ID、项目ID、登录/注销日期和时间等 我需要加入用户名和项目名。但是,它们位于另一个表中,但位于同一列(dbo.tblObjects.Name)中 例如:SQL查询-将同一列联接两次,sql,join,Sql,Join,我很难获得想要的结果,我想尝试两次从表中联接一列 我的第一个表是“dbo.Sessions”,它包含基本会话信息,如用户ID、项目ID、登录/注销日期和时间等 我需要加入用户名和项目名。但是,它们位于另一个表中,但位于同一列(dbo.tblObjects.Name)中 例如: +------+---------------+ | k_Id | Name | +------+---------------+ | 1 | AgentName1 | | 2 | Pr
+------+---------------+
| k_Id | Name |
+------+---------------+
| 1 | AgentName1 |
| 2 | ProjectNameX |
| 3 | ProjectNameY |
| 4 | AgentName2 |
| 5 | ProjectNameZ |
| 6 | AgentName3 |
+------+---------------+
为了达到我的目标,我使用了两个“左连接”。然而,我在这两方面都得到了重复的结果。我要么让这两列显示项目名称,要么显示用户名(取决于哪个“左连接”是第一个)
这就是我目前的情况:
SELECT SysDB.dbo.Sessions.*, SysDB.dbo.tblObjects.Name AS AgentName, SysDB.dbo.tblObjects.Name AS ProjectName
FROM SysDB.dbo.Sessions
LEFT JOIN SysDB.dbo.tblObjects ON SysDB.dbo.Sessions.userId = SysDB.dbo.Objects.k_Id
LEFT JOIN SysDB.dbo.tblObjects ON SysDB.dbo.Sessions.projectId = SysDB.dbo.Objects.k_Id
WHERE (SysDB.dbo.Sessions.loginDate BETWEEN 'm/d/yyyy' AND 'm/d/yyyy')
注意:SysDB是我每次识别的数据库的名称,因为这个查询是在外部运行的。在选择之前,我也不使用“use SysDB”,因为它在VBA宏中不起作用
注2:我在这个网站上找到了一条解决这个问题的线索,但我不明白正在做什么,它可以追溯到2012年。关于别名。解决方案提供在表名之前添加“ls.”和“lt.”,但这对我不起作用。表示该表不存在
注3:我尝试过许多不同的方法,例如:
LEFT JOIN SysDB.dbo.tblObjects AS AgentName ON SysDB.dbo.Sessions.userId = SysDB.dbo.tblObjects.k_Id
LEFT JOIN SysDB.dbo.tblObjects AS ProjectName ON SysDB.dbo.Sessions.projectId = SysDB.dbo.tblObjects.k_Id
如有任何见解,将不胜感激。谢谢 通过给每个表指定一个别名(
会话
,代理
,项目
,您可能会发现更容易看到您在做什么)
如果您两次使用同一个表进行连接,不仅更容易,还需要至少为其中一个表使用别名。谢谢,这很有效。出于某种原因,我现在理解了整个别名,而之前在另一个线程中我无法理解。我的实际查询有4个左连接,但其他两个来自其他表。我能够将其应用于整个查询,并且它可以正常工作。
SysDB.dbo.Objects
是对SysDB.dbo.tblObjects
的一种打字错误。您的注释3几乎是正确的:您必须使用ON
子句中的别名。Barmar,是的,它是一种类型。我知道我离这里不远了。
SELECT session.*, agent.Name AS AgentName, project.Name AS ProjectName
FROM SysDB.dbo.Sessions session
LEFT JOIN SysDB.dbo.tblObjects agent
ON session.userId = agent.k_Id
LEFT JOIN SysDB.dbo.tblObjects project
ON project.projectId = session.k_Id
WHERE (session.loginDate BETWEEN 'm/d/yyyy' AND 'm/d/yyyy')