2017-05-04 86 views
1

下面的查詢需要很長時間才能在兩個不同的數據庫中返回結果。有什麼方法可以簡化這個查詢嗎?簡化SQL Server查詢

WITH tblParent AS 
(
    SELECT * 
    FROM REFERENCES 
    WHERE referenced_id = 208593 

    UNION ALL 

    SELECT REFERENCES.* 
    FROM REFERENCES 
    JOIN tblParent ON REFERENCES.referenced_id = tblParent.entity_Id 
) 
SELECT DISTINCT(entity_Id) 
FROM tblParent 
WHERE entity_Id <> 208593 AND field_type = 'ChildField' 
OPTION(MAXRECURSION 5) 
+1

你爲什麼'select'ing從'REFERENCES'每列在'cte'當你只關心'entity_id'和'field_type' ? – iamdave

回答

0

由於您只對子entityId感興趣,那麼只需在遞歸CTE中選擇需要的字段即可。

WITH tblParent AS (
    SELECT entity_Id, referenced_id as baseId 
    FROM [REFERENCES] 
    WHERE referenced_id = 208593 

    UNION ALL 

    SELECT t.entity_Id, cte.baseId 
    FROM tblParent cte 
    JOIN [REFERENCES] t 
     ON (t.referenced_id = cte.entity_Id 
      AND t.entity_Id <> cte.baseId -- to avoid a circular reference 
     ) 
    WHERE t.field_type = 'ChildField' 
) 
SELECT DISTINCT entity_Id 
FROM tblParent 
WHERE entity_Id <> baseId 
OPTION(MAXRECURSION 5) 

,你可能想仔細檢查,如果有上referenced_id的索引。

1

這應該簡化它:

WITH tblParent AS 
(
    SELECT entity_Id, 0 c 
    FROM [REFERENCES] 
    WHERE referenced_id = 208593 
    UNION ALL 
    SELECT r.entity_Id, 1 
    FROM [REFERENCES] r 
    JOIN tblParent 
    ON r.referenced_id = tblParent.entity_Id 
) 
SELECT DISTINCT entity_Id 
FROM tblParent 
WHERE c = 1 
OPTION(MAXRECURSION 5) 

通過檢查C值,變得顯而易見的是,它是一個子值。我假設這個文本對所有孩子都有field_type ='ChildField'。

(參考文獻是保留字,DISTINCT不是一個函數)