2017-05-04 2 views
1

Die folgende Abfrage benötigt viel Zeit, um Ergebnisse in zwei verschiedenen Datenbanken zurückzugeben. Gibt es eine Möglichkeit, diese Abfrage zu vereinfachen?Vereinfachen der SQL Server-Abfrage

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

Warum 'Sie jede Spalte von' REFERENCES' in Ihrem 'cte' select'ing, wenn Sie nur über' entity_id' und 'field_type' Pflege ? – iamdave

Antwort

0

Da Sie in den Kindern EntityID einzigen interessiert sind, dann wählen Sie einfach die Felder, die Sie in der rekursiven CTE benötigen.

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) 

Und Sie könnten nochmals überprüfen wollen, ob ein Index für referenced_id gibt.

1

Dies sollte es vereinfachen:

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) 

durch den C-Wert überprüft, ist es offensichtlich wird, dass es ein Kind Wert ist. Ich nehme an, dass dieser Text field_type = 'ChildField' für alle Childs hat.

(Referenzen ist ein reserviertes Wort und DISTINCT ist keine Funktion)