2013-06-10 8 views
7

Ich habe diese Frage hier gesucht, konnte sie aber nicht finden. Bitte leiten Sie mich weiter, wenn wir sie bereits auf der Website haben.Wie CTE erstellen, die einen anderen CTE als Daten verwendet, um weiter zu begrenzen?

Ich bin auf der Suche nach einem Weg CTE zu schaffen, die einen anderen CTE als die Daten zur weiteren Begrenzung verwendet. Ich habe ein CTE, das einen Bericht für mich erstellt, aber ich möchte diesen Bericht mit einer anderen Eingabe unter Verwendung des vorhandenen CTE eingrenzen.

Ich hoffe meine Frage ist klar.

+0

Welche SQL-Dialekt ist das? – hvd

+0

Die eine, die ich benutze ist Dialekt 3 – curiousBoy

Antwort

17

Sie können 2 (oder mehr) CTEs miteinander verketten.

Zum Beispiel

with ObjectsWithA as 
(
    select * from sys.objects 
    where name like '%A%' 
), 
ObjectsWithALessThan100 as 
(
    select * from ObjectsWithA 
    where object_id < 100 
) 
select * from ObjectsWithALessThan100; 
+0

Vielen Dank, wie ein Weltmeister arbeitet :) – curiousBoy

8

Ein CTE kann zur vorherige CTEs verweisen:

with report as (
     <your query here> 
    ), 
    reportLimited as (
     select * 
     from report 
     where foo = @bar 
    ) 
select * 
from reportLimited 

Die einzige Regel ist, dass die Verweise sequenziellen sein. Keine Vorwärtsreferenzen.

+0

Vielen Dank – curiousBoy

5

Sicher, Referenz nur die direkt CTE:

WITH Source As 
( 
    SELECT * FROM AllData 
), 
Filtered AS 
(
    SELECT * FROM Source WHERE ID = 4 
) 
SELECT * FROM Filtered 
+0

Vielen Dank für Vorschlag, schätzen. – curiousBoy

0
WITH 
Source ---------1--------- 
As 
( 
    SELECT * FROM emp 
), 
destination----2---------- 
AS 
(
    SELECT * 
    FROM Source 
    WHERE E_id = 4 
) 

SELECT * FROM destination 
+2

Könnten Sie vielleicht erklären, was Sie getan haben? –

+0

Während Ihre Antwort die Frage lösen kann, ist es immer besser, wenn Sie eine Beschreibung des Problems und der Lösung Ihrer Frage bereitstellen können. Dies ist ein Vorschlag, um diese und zukünftige Antworten weiter zu verbessern. –

+0

@sangu patil: Ich kann keinen Unterschied zwischen diesem und anderen gegebenen Antworten sehen! Bevor du deine Antwort geschrieben hast, vergewissere dich, dass sie noch nicht gepostet wurde! Ansonsten ist es nur eine "Flut" und andere Menschen finden die Alternativen schwerer. – curiousBoy