2010-07-08 2 views
0

Je l'ai vu mention de l'Oracle clause WITH plusieurs fois ici pour aliasing une sous-requête comme ceci:SQL Server prend-il en charge la clause Oracle-like WITH?

WITH myData AS (SELECT id, text FROM SomeTable) 
SELECT myData from SomeOtherTable 

Est-ce une version de support SQL Server cela? Sinon, y a-t-il une raison particulière pour laquelle ils ne le font pas? Performance? Potentiel d'utilisation incorrecte?

+4

BTW, notez que ce n'est pas tellement "Oracle-like" comme "ANSI-SQL-like". –

+0

Vraiment? Seriez-vous capable de savoir où je peux trouver une copie de la norme ANSI-SQL? –

Répondre

5

SQL Server 2005 et versions ultérieures.

Je voulais ajouter que vous pouvez empiler ces à bon escient:

WITH A AS (
    SELECT * FROM X 
), B AS (
    SELECT * FROM A 
), C AS (
    SELECT * FROM B 
) 
SELECT * FROM C 

Vous pouvez même faire:

WITH A AS (
), B AS (
) 
SELECT * FROM A INNER JOIN B ON whatever 

Veuillez également remarquer que doit être le premier mot-clé dans un communiqué, alors vous le voyez souvent écrit comme:

;WITH A AS (
) 

Qui termine fondamentalement l'instruction précédente (les points-virgules sont k ind de facultatif dans T-SQL)

+0

Cool, je ne le savais pas! – harpo

4

Oui SQL2005 et SQL2008 le permettent tous les deux. Ils sont appelés Common Table Expressions.

+0

... et un joli concept pour plier la tête en essayant de maîtriser le CTE récursif! – spender

+0

Oui, mais en fait, le CTE récursif n'est pas si mal une fois que vous avez écrit quelques-uns. C'est bien mieux que les alternatives (telles qu'elles sont). – harpo

Questions connexes