需要帮助删除嵌套的INNER JOIN

时间:2014-09-25 15:08:54

标签: sql nested inner-join

我在SQL查询中有以下INNER JOIN语句,我想要更改,因此没有嵌套的INNER JOIN语句。我相信这会导致笛卡尔积,因为它需要20多分钟才能返回几千行结果。有人可以帮我弄清楚如何移除嵌套吗?

SELECT        
TECH_INCDT_V.INCDT_NUM_I AS [Incident Number], 
TECH_INCDT_V.ASGN_TO_USER_I AS [Incident Assigned User ID], 
SVY_RESP_V_3.RESP_VAL_Q AS [Survey Response], 
SVY_QUES_V_3.QUES_T AS [Survey Question]


FROM supt_oper_anls_dw.dbo.SVY_QUES_V AS SVY_QUES_V_7 
INNER JOIN supt_oper_anls_dw.dbo.SVY_RESP_V AS SVY_RESP_V_7 ON SVY_QUES_V_7.SVY_QUES_I = SVY_RESP_V_7.SVY_QUES_I 

-->START INNER JOIN "A"
INNER JOIN supt_oper_anls_dw.dbo.TECH_INCDT_V

    -->These are NESTED within the INNER JOIN "A" in the previous line
    INNER JOIN supt_oper_anls_dw.dbo.PERS_V ON TECH_INCDT_V.CRTE_USER_I = PERS_V.PERS_LAN_I 
    INNER JOIN supt_oper_anls_dw.dbo.SVY_TASK_V ON TECH_INCDT_V.INCDT_NUM_I = SVY_TASK_V.INCDT_NUM_I 
    INNER JOIN supt_oper_anls_dw.dbo.SVY_INSTC_V ON SVY_TASK_V.SVY_INSTC_I = SVY_INSTC_V.SVY_INSTC_I 
    INNER JOIN supt_oper_anls_dw.dbo.SVY_RESP_V ON SVY_INSTC_V.SVY_INSTC_I = SVY_RESP_V.SVY_INSTC_I 
    INNER JOIN supt_oper_anls_dw.dbo.SVY_QUES_V ON SVY_RESP_V.SVY_QUES_I = SVY_QUES_V.SVY_QUES_I 
    INNER JOIN supt_oper_anls_dw.dbo.SVY_TASK_V AS SVY_TASK_V_3 ON TECH_INCDT_V.INCDT_NUM_I = SVY_TASK_V_3.INCDT_NUM_I AND SVY_INSTC_V.SVY_INSTC_I = SVY_TASK_V_3.SVY_INSTC_I 
    INNER JOIN supt_oper_anls_dw.dbo.SVY_RESP_V AS SVY_RESP_V_3 ON SVY_INSTC_V.SVY_INSTC_I = SVY_RESP_V_3.SVY_INSTC_I 
    INNER JOIN supt_oper_anls_dw.dbo.SVY_QUES_V AS SVY_QUES_V_3 ON SVY_RESP_V_3.SVY_QUES_I = SVY_QUES_V_3.SVY_QUES_I 
    INNER JOIN supt_oper_anls_dw.dbo.SVY_TASK_V AS SVY_TASK_V_7 ON TECH_INCDT_V.INCDT_NUM_I = SVY_TASK_V_7.INCDT_NUM_I AND SVY_INSTC_V.SVY_INSTC_I = SVY_TASK_V_7.SVY_INSTC_I 
    -->Nesting ends here

-->END INNER JOIN "A"
ON SVY_RESP_V_7.SVY_INSTC_I = SVY_INSTC_V.SVY_INSTC_I 

INNER JOIN supt_oper_anls_dw.dbo.PERS_V AS PERS_V_2 ON SVY_INSTC_V.CMPL_BY_USER_I = PERS_V_2.PERS_LAN_I 
LEFT OUTER JOIN supt_oper_anls_dw.dbo.ACCT_DATE_DIM AS ACCT_DATE_DIM_OPEN ON CONVERT(varchar(8), TECH_INCDT_V.CRTE_TS, 112) = ACCT_DATE_DIM_OPEN.GREG_D 
LEFT OUTER JOIN supt_oper_anls_dw.dbo.ACCT_DATE_DIM AS ACCT_DATE_DIM_SVY ON CONVERT(varchar(8), SVY_INSTC_V.CMPL_TS, 112) = ACCT_DATE_DIM_SVY.GREG_D

WHERE        
(SVY_QUES_V.SVY_QUES_I IS NOT NULL) AND 
(TECH_INCDT_V.CRTE_WKGRP_N LIKE '%FAKE%' OR TECH_INCDT_V.CRTE_WKGRP_N IS NULL)

GROUP BY 
TECH_INCDT_V.INCDT_NUM_I,
TECH_INCDT_V.ASGN_TO_USER_I, 
SVY_RESP_V_3.RESP_VAL_Q, 
SVY_QUES_V_3.QUES_T, 
SVY_QUES_V_3.SVY_QUES_I,
TECH_INCDT_V.CRTE_TS 

我正试图摆脱这里之间嵌套的INNER JOIN语句:

INNER JOIN supt_oper_anls_dw.dbo.TECH_INCDT_V

,此处:

ON SVY_RESP_V_7.SVY_INSTC_I = SVY_INSTC_V.SVY_INSTC_I 

1 个答案:

答案 0 :(得分:1)

没有'嵌套' joins(无论这意味着什么),只是不完整joins。您的inner join' A'没有ON条款。您在注释中提到的ON子句与连接中的表无关。你是joining supt_oper_anls_dw.dbo.PERS_V on加入表中的表格' A' (以及其他几个),但你不是joining supt_oper_anls_dw.dbo.TECH_INCDT_V。正如@navigator所说,你需要在加入" A"之后添加一个ON子句。在你所谓的“嵌套”之前连接。使用所提供的信息无法说出ON条款应该是什么。

另外,你的RDBMS是什么?