섹션 중간의 쿼리에서 IN 키워드를 사용하고 있습니다. 중첩 쿼리를 사용하고 있고 In
을 Exists
으로 바꾸려면 노인이 저에게 말한 성능 문제로 인해 문제가 발생할 수 있습니다.IN을 EXISTS 또는 COUNT로 바꿉니다. 그것을하는 방법. 여기서 누락 된 것은 무엇입니까?
일부 쿼리가 누락되었습니다.이 쿼리에서 무엇을 찾고 있습니까? 이 쿼리에는 읽기 쉽도록 일부 별칭이 포함되어 있습니다.
어떻게 제거 할 수 있습니까?
SELECT TX.PK_MAP_ID AS MAP_ID
, MG.PK_GUEST_ID AS Guest_Id
, MG.FIRST_NAME
, H.PK_CATEGORY_ID AS Preference_Id
, H.DESCRIPTION AS Preference_Name
, H.FK_CATEGORY_ID AS Parent_Id
, H.IMMEDIATE_PARENT AS Parent_Name
, H.Department_ID
, H.Department_Name
, H.ID_PATH, H.DESC_PATH
FROM
dbo.M_GUEST AS MG
LEFT OUTER JOIN
dbo.TX_MAP_GUEST_PREFERENCE AS TX
ON
(MG.PK_GUEST_ID = TX.FK_GUEST_ID)
LEFT OUTER JOIN
dbo.GetHierarchy_Table AS H
ON
(TX.FK_CATEGORY_ID = H.PK_CATEGORY_ID)
WHERE
(MG.IS_ACTIVE = 1)
AND
(TX.IS_ACTIVE = 1)
AND
(H.Department_ID IN -----How to remove this IN operator with EXISTS or Count()
(
SELECT C.PK_CATEGORY_ID AS DepartmentId
FROM
dbo.TX_MAP_DEPARTMENT_OPERATOR AS D
INNER JOIN
dbo.M_OPERATOR AS M
ON
(D.FK_OPERATOR_ID = M.PK_OPERATOR_ID)
AND
(D.IS_ACTIVE = M.IS_ACTIVE)
INNER JOIN
dbo.L_USER_ROLE AS R
ON
(M.FK_ROLE_ID = R.PK_ROLE_ID)
AND
(M.IS_ACTIVE = R.IS_ACTIVE)
INNER JOIN
dbo.L_CATEGORY_TYPE AS C
ON
(D.FK_DEPARTMENT_ID = C.PK_CATEGORY_ID)
AND
(D.IS_ACTIVE = C.IS_ACTIVE)
WHERE
(D.IS_ACTIVE = 1)
AND
(M.IS_ACTIVE = 1)
AND
(R.IS_ACTIVE = 1)
AND
(C.IS_ACTIVE = 1)
)--END INNER QUERY
)--END Condition
IN을 EXISTS 또는 COUNT로 바꾸면 어떤 새로운 문제가 발생할 수 있습니까? 기본적으로
그래, 나는 명명 표준이 성가신다고 생각했다. 그들은 확실히 쿼리를 덜 읽을 수있게합니다. – SiN
SIN : 명명 규칙이 약간 터무니 없다는 것에 동의하지만, PM도 TL도 아닌 SE도 변경 될 수 있으므로, 우리에게 들려오는 내용을 따라야합니다. 여기 내 질문은 H.Department 제거의 영향입니다. 내가 여기서 생각하는 것은 어떻게 그것이 같은 결과를 얻는가하는 것이다. –
나는 그것이 H 테이블에 합류해야한다고 생각한다. 위에서 변경 한 사항. 그러나 지금 나는 그 의도를 잘 모르겠다. 내부 쿼리에서 H 테이블을 사용하면 속도가 크게 느려질 수 있습니다. – MJB