我在查询中使用了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