首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您可以在没有ON关键字的情况下进行内连接吗?

您可以在没有ON关键字的情况下进行内连接吗?
EN

Stack Overflow用户
提问于 2012-06-02 03:08:55
回答 3查看 20.7K关注 0票数 18

在调试一些Oracle代码时,我遇到了这个查询:

代码语言:javascript
复制
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

我被这句话搞糊涂了:

代码语言:javascript
复制
INNER JOIN TPM_TASK

我以前从未见过没有ON子句的JOIN。同样令人困惑的是这句话:

代码语言:javascript
复制
ON TPM_GROUP.GROUPID = TPM_GROUPTASKS.GROUPID

这看起来像是一个没有任何匹配JOIN的随机ON子句。查询运行时没有任何错误,并且返回了一堆数据,很明显,语法是完全有效的。有人能解释一下这里到底发生了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-02 03:16:43

小宇宙..。昨天我遇到了一个生成这种语法的工具,这让我非常困惑。

显然,

代码语言:javascript
复制
FROM a 
     INNER JOIN b
     INNER JOIN c ON (b.id = c.id)
     ON (a.id = c.id)

等同于嵌套子查询

代码语言:javascript
复制
FROM a
     INNER JOIN (SELECT <<list of columns>>
                   FROM b
                        INNER JOIN c ON (b.id=c.id)) c
             ON (a.id = c.id)
票数 22
EN

Stack Overflow用户

发布于 2012-06-02 03:16:05

我认为这只是一个查询排序的问题(因为只有INNER JOIN,它们的顺序并不是很重要)。我重新提出了你的查询,现在看起来是这样的:

代码语言:javascript
复制
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 

对你来说更有意义吗?对我来说更有意义。

票数 5
EN

Stack Overflow用户

发布于 2012-06-02 03:22:06

如果里面有括号的话看起来还不错...

代码语言:javascript
复制
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

但是因为它们都是内部连接,所以我同意Lamak的回答。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10856016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档