SQL 查询 - 两次连接同一列
SQL Query - Join the same column twice
我在尝试从 table 中加入列两次时无法获得我想要的结果。
我的第一个 table 是 "dbo.Sessions",其中包含基本会话信息,例如用户 ID、项目 ID、login/logout 日期和时间等。
我需要加入用户名和项目名。然而,这些在另一个 table 中找到,但在同一列 (dbo.tblObjects.Name) 中。
示例:
+------+---------------+
| k_Id | Name |
+------+---------------+
| 1 | AgentName1 |
| 2 | ProjectNameX |
| 3 | ProjectNameY |
| 4 | AgentName2 |
| 5 | ProjectNameZ |
| 6 | AgentName3 |
+------+---------------+
为了实现我的目标,我使用了两个 "LEFT JOIN"。但是,我在两者中都得到了重复的结果。我将让两列显示项目名称或用户名(取决于第一个 "LEFT JOIN")。
这是我目前所拥有的:
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 年。关于别名的一些事情。该解决方案提供在 table 名称之前添加 "ls." 和 "lt.",但这对我不起作用。说 table 不存在。
SQL Query Join Same Column Twice
注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
如有任何见解,我们将不胜感激。谢谢!
您可能会发现通过给每个 table 一个别名(下面的 session
、agent
、project
)[=14] 可以更容易地看到您在做什么=]
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')
我在尝试从 table 中加入列两次时无法获得我想要的结果。
我的第一个 table 是 "dbo.Sessions",其中包含基本会话信息,例如用户 ID、项目 ID、login/logout 日期和时间等。
我需要加入用户名和项目名。然而,这些在另一个 table 中找到,但在同一列 (dbo.tblObjects.Name) 中。
示例:
+------+---------------+
| k_Id | Name |
+------+---------------+
| 1 | AgentName1 |
| 2 | ProjectNameX |
| 3 | ProjectNameY |
| 4 | AgentName2 |
| 5 | ProjectNameZ |
| 6 | AgentName3 |
+------+---------------+
为了实现我的目标,我使用了两个 "LEFT JOIN"。但是,我在两者中都得到了重复的结果。我将让两列显示项目名称或用户名(取决于第一个 "LEFT JOIN")。
这是我目前所拥有的:
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 年。关于别名的一些事情。该解决方案提供在 table 名称之前添加 "ls." 和 "lt.",但这对我不起作用。说 table 不存在。
SQL Query Join Same Column Twice
注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
如有任何见解,我们将不胜感激。谢谢!
您可能会发现通过给每个 table 一个别名(下面的 session
、agent
、project
)[=14] 可以更容易地看到您在做什么=]
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')