2014-09-25 2 views
-1

중첩 된 INNER JOIN 문이 없도록 변경하려는 SQL 쿼리에 다음과 같은 INNER JOIN 문이 있습니다. 나는이 결과가 수천 행을 반환하는 데 20 + 분이 걸리기 때문에 이것이 데카르트 제품을 야기한다고 믿습니다. 누군가가 중첩을 제거하는 방법을 알아낼 수 있습니까? 여기도움이 필요 중첩 된 내부 조인 제거

INNER JOIN supt_oper_anls_dw.dbo.TECH_INCDT_V 

과 :

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 여기 사이에 문을 가입 중첩을 제거하려고하지있어

ON SVY_RESP_V_7.SVY_INSTC_I = SVY_INSTC_V.SVY_INSTC_I 
+2

전체 SQL – navigator

+0

을 게시하십시오. 'INNER JOIN supt_oper_anls_dw.dbo.TECH_INCDT_V' 앞에 ON 문이 없습니다. 이것이 왜 당신이 데카르트 제품을 얻는 이유입니다. 테이블을 올바른 방법이나 순서로 조인해야합니다. DB 스키마를 알지 못하면 조인이 어떻게 발생해야하는지 파악할 수 없습니다. – navigator

+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가 말했듯이, ON 절을 추가해야합니다. "A"를 조인하고 소위 '중첩 된 조인'을 시작하기 전에. 그 정보는 제공된 정보로는 말하기가 불가능합니다.

또한 RDBMS는 무엇입니까?

+0

'ON SVY_RESP_V_7.SVY_INSTC_I = SVY_INSTC_V.SVY_INSTC_I'를 제거하면 쿼리에서 오류가 발생하고 더 이상 실행되지 않습니다. 어딘가에 옮기면 쿼리에서 오류가 발생하고 더 이상 실행되지 않습니다. 삭제하면 쿼리에 오류가 발생하고 더 이상 실행되지 않습니다. 가장 확실하게 사용되고 있기 때문에 사용 방법과 이동 또는 삭제가 실패한 이유를 설명 할 수 있습니다. 또한 "RDBMS"의 의미를 알지 못합니다 ... 저는 약 2 년 동안 SQL 만 사용하여 왔으며이 쿼리에서 추측 할 수있는 것 이상으로 테이블에 대한 정보를 공유 할 수 없습니다. 이것은 내 쿼리가 아니라 직장에서 나에게 건네졌다 ... –

+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

+0

나는이 쿼리가 정확하지 않다는 것에 동의하며 어쩌면 나는 내 원래 포스트에서 이런 식으로 나에게 건네 졌다는 말을 했어야했다. 그래서 나는 downvoted을 얻지 않을 것이다 ... 나는 단지 다른 누군가의 엉망을 여기에서 정리하려고하고있다. –