Sql 你能有一个没有ON关键字的内部连接吗?
在调试一些Oracle代码时,我遇到了以下查询:Sql 你能有一个没有ON关键字的内部连接吗?,sql,oracle,join,oracle11g,Sql,Oracle,Join,Oracle11g,在调试一些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_PROJECTV
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 TPM_GROUP.GROUPID = TPM_GROUPTASKS.GROUPID
我以前从未见过没有ON子句的JOIN。同样令人困惑的是:
INNER JOIN TPM_TASK
ON TPM_GROUP.GROUPID = TPM_GROUPTASKS.GROUPID
这似乎是一个没有任何匹配联接的随机ON子句。查询运行时没有任何错误,并返回一组数据,显然语法是完全有效的。有人能解释一下这里到底发生了什么吗?我认为这只是查询排序的问题,因为只有内部联接,它们的顺序其实并不重要。我重新搜索了您的查询,现在看起来是这样的:
SELECT TPM_TASK.TASKID
FROM TPM_GROUP
INNER JOIN TPM_USERGROUPS
ON TPM_GROUP.GROUPID = TPM_USERGROUPS.GROUPID
INNER JOIN TPM_GROUPTASKS
ON TPM_GROUP.GROUPID = TPM_GROUPTASKS.GROUPID
INNER JOIN TPM_TASK
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
现在对你更有意义了吗?对我有意义。小宇宙。。。昨天我遇到了一个生成这种语法的工具,感到相当困惑 显然
FROM a
INNER JOIN b
INNER JOIN c ON (b.id = c.id)
ON (a.id = c.id)
相当于嵌套子查询
FROM a
INNER JOIN (SELECT <<list of columns>>
FROM b
INNER JOIN c ON (b.id=c.id)) c
ON (a.id = c.id)
如果里面有括号的话看起来就好了
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
但由于它们都是内部连接,我同意拉马克的回答。好吧,如果这种语法让伟大的贾斯汀洞穴感到困惑,那么我肯定不会感觉太糟糕。我将在一些简单的查询中使用它,以便完全理解。谢谢你知道我盯着这个看了好长时间了,但我搞不懂。我认为我的困惑在于将c用作表和子查询的别名。这是打字错误还是典型用法?@NeilBarnwell-这不是打字错误。我相信我是以这种方式构造别名的,因为原始查询中的c既用作表,也用作子查询的别名。您可以使用别名为d的子查询和连接条件a.id=d.id编写相同的代码。我甚至不知道你可以这么做,因为它怎么知道你指的是别名c,还是实际的表c?我想这是一个优先考虑的问题,我希望出现某种模糊的引用错误。顺便说一句,如果有人正在搜索如何在没有on子句的情况下创建连接,就像我一样,您可以使用“交叉连接”来执行此操作,这将返回笛卡尔积。