Sql 你能有一个没有ON关键字的内部连接吗?

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

在调试一些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 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子句的情况下创建连接,就像我一样,您可以使用“交叉连接”来执行此操作,这将返回笛卡尔积。