【发布时间】:2012-06-07 00:48:09
【问题描述】:
在调试一些 Oracle 代码时,我遇到了这个查询:
SELECT TPM_TASK.TASKID FROM TPM_GROUP
INNER JOIN TPM_USERGROUPS ON TPM_GROUP.GROUPID = TPM_USERGROUPS.GROUPID
INNER JOIN TPM_TASK
INNER JOIN TPM_GROUPTASKS ON TPM_TASK.TASKID = TPM_GROUPTASKS.TASKID
INNER JOIN TPM_PROJECTVERSION ON TPM_TASK.PROJECTID = TPM_PROJECTVERSION.PROJECTID AND TPM_TASK.VERSIONID = TPM_PROJECTVERSION.VERSIONID
INNER JOIN TPM_TASKSTAGE ON TPM_TASK.STAGEID = TPM_TASKSTAGE.STAGEID
INNER JOIN TPM_PROJECTSTAGE ON TPM_PROJECTVERSION.STAGEID = TPM_PROJECTSTAGE.STAGEID
ON TPM_GROUP.GROUPID = TPM_GROUPTASKS.GROUPID
我被这条线弄糊涂了:
INNER JOIN TPM_TASK
我以前从未见过没有ON 子句的JOIN。同样令人困惑的是这条线:
ON TPM_GROUP.GROUPID = TPM_GROUPTASKS.GROUPID
这似乎是一个随机的ON 子句,没有任何匹配的JOIN。查询运行没有任何错误,并返回一堆数据,因此很明显语法是完全有效的。有人可以解释一下这里到底发生了什么吗?
【问题讨论】:
-
附带说明,如果有人正在搜索如何在没有 ON 子句的情况下创建连接(就像我一样),您可以使用“CROSS JOIN”来执行此操作,这将返回笛卡尔积。