我在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
請發佈完整的SQL – navigator 2014-09-25 15:11:40
您錯過了'INNER JOIN supt_oper_anls_dw.dbo.TECH_INCDT_V'前面的ON語句。這就是你獲得笛卡爾產品的原因。您需要以正確的方式或順序連接表格。在不知道數據庫模式的情況下,無法確定聯接是如何發生的。 – navigator 2014-09-26 06:25:55
什麼都沒有丟失。查詢按原樣運行。 – 2014-09-26 13:20:28