我在查詢中使用了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
如果我用EXISTS或COUNT取代IN,可能會出現什麼新問題?
是的,我認爲命名標準也很煩人。他們肯定會使查詢不易讀。 – SiN 2010-06-24 12:29:03
SIN:我同意命名約定有點荒謬,但我不是PM也不是TL,只是一個SE所以不能改變它,並且必須遵循已經告訴我們的東西,因爲它不能幫助我自己。這裏我的問題是去除H.Department的影響。正如我在這裏所想的那樣,它將如何獲得相同的結果。 – 2010-06-24 12:44:55
我認爲它應該加入H表。上面所做的更改。但是現在我不確定我是否理解這個意圖。在內部查詢中使用H表可能會顯着減慢它的速度。 – MJB 2010-06-24 12:58:21