Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询-将同一列联接两次_Sql_Join - Fatal编程技术网

SQL查询-将同一列联接两次

SQL查询-将同一列联接两次,sql,join,Sql,Join,我很难获得想要的结果,我想尝试两次从表中联接一列 我的第一个表是“dbo.Sessions”,它包含基本会话信息,如用户ID、项目ID、登录/注销日期和时间等 我需要加入用户名和项目名。但是,它们位于另一个表中,但位于同一列(dbo.tblObjects.Name)中 例如: +------+---------------+ | k_Id | Name | +------+---------------+ | 1 | AgentName1 | | 2 | Pr

我很难获得想要的结果,我想尝试两次从表中联接一列

我的第一个表是“dbo.Sessions”,它包含基本会话信息,如用户ID、项目ID、登录/注销日期和时间等

我需要加入用户名和项目名。但是,它们位于另一个表中,但位于同一列(dbo.tblObjects.Name)中

例如:

+------+---------------+
| 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')