2009-01-28 5 views
13

Ich muss so etwas tun, aber SQL Server 2008 mag es nicht. Meine Abfrage ist tatsächlich komplexer als das und ich weiß, dass dies nicht der beste Weg ist, um das zu erreichen, was ich tue, aber mein Fokus liegt auf der Funktionalität der WITH-Anweisung und nicht auf den Select- und Where-Anweisungen.Kann ich WITH in TSQL zweimal verwenden, um eine Ergebnismenge wie mein Beispiel zu filtern?

MIT stuff1 AS ( select name, startdate, id von Mitarbeitern, wo startdate> 0)

MIT stuff2 AS ( select name, startdate, id von stuff1)

select * from stuff2 wo id> 10

+0

Theres keine Schande in der Verwendung einer temporären Tabelle oder Tabelle Variable, wenn Sie eine benötigen – Juliet

Antwort

29

Ich mache es die Zeit:

Ein Beispiel für Unterabfragen Nordwind mit: finden

SELECT * FROM 
    (SELECT * FROM 
     (SELECT * FROM dbo.Employees WHERE Country = 'USA') as TableFiltered1 
    ) AS TableFilterd2 WHERE City = 'Seattle' 

Sie zwei CTEs verwenden können, aber vielleicht nicht so, wie Sie wollen :

Soweit ich sagen kann, habe ich keine Grenze in CTEs erreicht.

Das einzige, was Sie nicht tun können (was ziemlich nützlich wäre) ist die Wiederverwendung CTEs in getrennten SELECT s:

WITH stuff1 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM employees 
    WHERE startdate > 0 
) 
,stuff2 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM stuff1 
) 
SELECT * 
FROM stuff2 
WHERE id > 10 
; 
SELECT * 
FROM stuff2 
WHERE id < 10 

Say. Stattdessen müssen Sie die gesamte CTE-Kette erneut kopieren und einfügen.

+0

funktioniert das obige ohne das; Terminator zwischen der ersten und der zweiten Auswahl? –

+0

Nr. CTEs können nur in einem einzigen Vorgang verwendet werden. EINFÜGEN/AUSWÄHLEN/LÖSCHEN was auch immer, aber sie werden im Grunde an diesem Punkt konsumiert. –

+0

gut zu wissen, danke! –

-3

Nein, Sie können nur einen CTE in einer Aussage haben, wie ich neulich erfuhr.

BEARBEITEN: Und diese WITH-Anweisung ist ein allgemeiner Tabellenausdruck, sehr praktische Funktion.

+0

Eigentlich können Sie mehrere CTEs, und sie können aufeinander aufbauen und sogar mehrere CTEs innerhalb der CTE-Kette, getrennt mit einem Komma - nur einer WITH-Anweisung kann verwendet werden. –

+0

Ich hatte nicht bemerkt, dass sie durch Komma getrennt sein mussten. Dies wird praktisch sein. Ich habe mein SQL 2008 Buch gelesen und sie erwähnen CTE's, aber sie erwähnen nicht die Verwendung von mehreren CTE's in einer Abfrage, was eine Schande ist. – Kezzer

+0

Ja, ich habe ein Beispiel unten gepostet. Ich benutze es sehr stark für das letzte Jahr in einem Port von einem 3GL-System. –

0

Sie können uns möglicherweise eine Reihe von Unterabfragen stellen. Oder Unterabfragen, die in einem CTE verschachtelt sind. alle
http://www.4guysfromrolla.com/webtech/071906-1.shtml

+1

Nach meiner Erfahrung kann alles mit Unterabfragen sehr schnell transformiert werden, um CTEs zu verwenden. Die reduzierte Verschachtelungstiefe und die Fähigkeit, sie sehr einfach im Deklarationsstil zu schichten und sich nicht zu wiederholen, macht die Lesbarkeit und Wartbarkeit signifikant. –

+0

Ich stimme zu. Aus diesem Grund habe ich den Link eingefügt, der ein Beispiel für einen durch Komma getrennten CTE zeigt. Ich denke, es ist das 3. oder 4. Beispiel in der "4guys" -Links. Ich habe versucht, alle Optionen zu gestalten. – BuddyJoe

Verwandte Themen