2014-09-25 113 views
-1

我在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 
+2

請發佈完整的SQL – navigator 2014-09-25 15:11:40

+0

您錯過了'INNER JOIN supt_oper_anls_dw.dbo.TECH_INCDT_V'前面的ON語句。這就是你獲得笛卡爾產品的原因。您需要以正確的方式或順序連接表格。在不知道數據庫模式的情況下,無法確定聯接是如何發生的。 – navigator 2014-09-26 06:25:55

+0

什麼都沒有丟失。查詢按原樣運行。 – 2014-09-26 13:20:28

回答

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是什麼?

+0

如果我刪除'ON SVY_RESP_V_7.SVY_INSTC_I = SVY_INSTC_V.SVY_INSTC_I',查詢會發出錯誤並不再運行。如果我將它移動到任何地方,查詢都會發出錯誤並不再運行。如果我刪除它,查詢會發出錯誤並不再運行。它肯定被使用,所以也許你可以解釋它是如何被使用的,以及它被移動或刪除時失敗的原因。另外,我不知道什麼是「RDBMS」的意思......我只使用了SQL約2年,除了可以從這個查詢中推斷出來之外,我絕對無法分享有關表的任何信息。這不是我的查詢,它是在工作中交給我的... – 2014-10-03 13:48:21

+1

RDMS是您的數據庫管理系統,因此Oracle,SQL Server,MySQL等您應該爲您的INNER JOIN A添加ON子句,並更改您的最後一個ON子句設置爲「AND SVY_RESP_V_7.SVY_INSTC_I = SVY_INSTC_V.SVY_INSTC_I」。我無法幫助您制定ON條款,我需要更多關於表結構的信息。你應該問問你是否也不知道。我很驚訝這個查詢甚至可以運行,更不用說返回一個接近你想要的結果,整個聯接語法在邏輯上是不正確的。 – HoneyBadger 2014-10-06 07:31:53

+0

我同意這個查詢是不正確的,也許我應該提到它在我原來的帖子中以這種方式遞給我,所以我不會downvoted ...我只是想清理別人的混亂在這裏.. – 2014-10-06 18:59:55