programing

ON 키워드 없이 INNER JOIN이 가능한가요?

starjava 2023. 7. 11. 21:23
반응형

ON 키워드 없이 INNER JOIN이 가능한가요?

일부 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

본 적이 없습니다.JOIN무턱내지 않고ON전절또한 혼란스러운 것은 다음과 같습니다.

ON TPM_GROUP.GROUPID = TPM_GROUPTASKS.GROUPID

이것은 무작위인 것 같습니다.ON일치하지 않는 절JOIN쿼리는 오류 없이 실행되고 많은 데이터를 반환하므로 구문이 완벽하게 유효합니다.여기서 무슨 일이 일어나고 있는지 누가 좀 밝혀줄 수 있나요?

작은 우주...나는 어제 이 구문을 생성하는 도구를 우연히 발견했고 다소 당황했습니다.

보아하니,

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)

저는 이것이 단지 당신의 질문을 주문하는 것의 문제라고 생각합니다.INNER JOINs, 그들의 순서는 실제로 그렇게 중요하지 않습니다).쿼리를 재정렬했는데 다음과 같이 표시됩니다.

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 

지금 그게 더 말이 됩니까? 저한테는 그래요.

안에 괄호가 있으면 괜찮을 것 같아요

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

그러나 그들은 모두 내면의 결합이기 때문에 저는 라막의 대답에 동의합니다.

언급URL : https://stackoverflow.com/questions/10856016/can-you-have-an-inner-join-without-the-on-keyword

반응형