JOIN 特定语法的 ON 子句?

VDG*_*VDG 2 sql-server-2005 join sql-server

我对 JOIN 操作的语法有点好奇,特别是我们设置条件的 ON 子句。假设我们正在对现有表和我们刚刚创建为 JOIN 中的子查询的表执行连接,例如:

SELECT DISTINCT ssn, job, identifier, startdate, enddate, salary, ceasing
FROM oldcontracts
JOIN (SELECT DISTINCT name, identifier FROM jobs)
ON oldcontracts.job = jobs.name
;
Run Code Online (Sandbox Code Playgroud)

这里的问题是,我们将如何设置一个有效的 ON 条件?我这样说是因为语法具有以下形式:

table1.column <condition> table2.column
Run Code Online (Sandbox Code Playgroud)

显然,SQL 2005 对我们从何处获取这些列非常严格。这意味着我在 jobs.name 上收到一个错误,说它不是一个有效的标识符。我假设 SQL 抛出这个错误是因为作业不是在操作中加入的表。

我知道解决这个问题的方法是简单地将作业设置为 table2 以在 JOIN 中使用,并根据需要调整 SELECT,然后一切都会工作,但我很想知道是否有办法解决一列一个子查询,假设该特定子查询是在 JOIN 操作中用作 table2 的那个?

Jus*_*ave 9

通常,您只需为子查询添加别名(我认为在 SQL Server 中是必需的)

SELECT DISTINCT ssn, job, identifier, startdate, enddate, salary, ceasing
  FROM oldcontracts
       JOIN (SELECT DISTINCT name, identifier 
               FROM jobs) mysubquery
         ON oldcontracts.job = mysubquery.name
Run Code Online (Sandbox Code Playgroud)

我强烈建议您始终为查询中的任何表设置别名,并为select列表中的每一列使用这些别名。这使得很多更容易看到其中不同的数据元素的来源,使当您添加在今后进行更多的加入更容易。