Comment faire son nid CTE correctement
Cette question a été demandé à quelques reprises, mais je n'ai toujours pas réussi à se sortir de la réponse ou de la bonne façon de le faire:
...
;WITH CTE AS
(
SELECT * FROM ...
)
SELECT *, [dbo].[udf_BetaInv](A, B, C, D) AS 'Loss'
FROM CTE
WHERE (Loss >= @MinRetention)
Cela ne fonctionne pas et je ne peut pas créer la procédure stockée, il est clair que je ne peut pas utiliser la Perte dans le cas OÙ, car il n'existe pas dans ce champ d'application.
Je voudrais utiliser un autre CTE pour conclure un pour que je puisse mettre la OÙ sur l'extérieur, mais ne semble ne pas fonctionner, essayé ceci:
;WITH CTE AS
(
SELECT * FROM ...
)
SELECT *, [dbo].[udf_BetaInv(A, B, C, D) AS 'Loss'
FROM CTE,
RESULTS AS
(SELECT * FROM CTE)
SELECT *
FROM RESULTS
WHERE (Loss >= @MinRetention)
Mais il ne compile pas en SQL Serveur, j'obtiens un message d'erreur indiquant qu'un " ("égare de nombreuses lignes ci-dessus, mais n'a rien à faire, si je supprime le deuxième CTE il fonctionne très bien.
Je veux seulement éviter la duplication de code, pas envie d'appeler mon [udf_BetaInv] deux fois dans la sélection et aussi dans le où les.
[Loss]
(un nom de colonne) pas 'Loss'
(une chaîne)? Pas sûr que ce serais la cause de l'erreur, siOriginalL'auteur Davide Piras | 2011-09-05
Vous devez vous connecter pour publier un commentaire.
Vous avez un intermédiaire
SELECT
que vous ne devriez pas avoir. Cela devrait fonctionner:Il n'est pas nécessaire, mais une bonne pratique explicitement le nom des colonnes dans votre CTE nom, c'est à dire .... Les RÉSULTATS([noms de colonne de CTE], de la perte) .... Vous vous remercierez plus tard :P.
OriginalL'auteur AakashM
Évidemment le problème avec la première requête est que la "Perte" n'est qu'un alias de colonne et ne peut pas être utilisé dans un
WHERE
clause. Vous êtes en droit de l'utiliser dans une expression de table commune permettrait d'éviter la duplication de l'expression. Voici comment vous pouvez le faire;Sur une note de côté: Voyez si vous pouvez briser l'habitude de commencer votre CTE définitions avec
;WITH
et au lieu de cela, prenez l'habitude de mettre fin à toutes vos instructions SQL avec un point-virgule. C'est plus lisible et mieux la pratique.J'ai besoin de la deuxième CTE à l'intérieur de la première, la requête en dépend. Est-il possible de le faire?
Plus un pour "briser l'habitude de commencer votre CTE définitions ;
OriginalL'auteur Matt Hamilton
Ci-dessous l'exemple d'imbrication des
CTE
.C'est imbriquée Dave. En fait, il est à peu près la définition d'un imbriquée CTE. Pensiez-vous de l'expression de table commune récursive? C'est un tout nouveau jeu de balle et beaucoup plus amusant, mais pas ce que l'OP a demandé.
OriginalL'auteur Subhransu Panda