Vous avez déjà une variété de réponses, certaines d'entre elles plus utiles que d'autres. Mais pour répondre directement à votre question:
Non, SQL Server ne vous permettra pas de référencer l'alias de colonne (défini dans la liste de sélection) dans le prédicat (la clause WHERE). Je pense que cela suffit pour répondre à la question que vous avez posée.
Détails supplémentaires:
(cette discussion va au-delà de la question initiale que vous avez demandé.)
Comme vous l'avez dit, il y a plusieurs solutions de contournement disponibles. Le plus problématique avec la requête que vous avez publiée (comme d'autres l'ont déjà signalé) est que nous ne sommes pas sûrs que la sous-requête de la liste SELECT ne renvoie qu'une seule ligne. Si elle ne retourne plus d'une ligne, SQL Server lancera une « trop de lignes » exception:
Subquery returned more than 1 value.
This is not permitted when the subquery
follows =, !=, , >= or when the
subquery is used as an expression.
Pour la discussion qui suit, je vais supposer que cette question est déjà suffisamment pris en compte.
Parfois, la façon la plus simple de rendre l'alias disponible dans le prédicat consiste à utiliser une vue en ligne.
SELECT v.*
FROM (SELECT *
, (SELECT Table1.Column
FROM Table1
JOIN Table2 ON Table1.Table2Id = Table2.Id
WHERE Table1.Column = 1
) as tmp
FROM Table2
) v
WHERE v.tmp = 1
Notez que SQL Server ne poussera pas le prédicat de la requête externe (WHERE v.tmp = 1
) dans la sous-requête dans la vue en ligne. Vous devez donc le faire vous-même en incluant le prédicat WHERE Table1.Column = 1
dans la sous-requête, en particulier si vous dépendez de cela pour que la sous-requête renvoie une seule valeur.
C'est juste une approche pour contourner le problème, il y en a d'autres. Je soupçonne que le plan de requête pour cette requête SQL Server ne va pas être optimal, pour la performance, vous voulez probablement aller avec un prédicat JOIN ou un prédicat EXISTS.
REMARQUE: je ne suis pas un expert en matière d'utilisation de MySQL. Je ne suis pas très familier avec le support de MySQL pour les sous-requêtes. Je sais (d'après une expérience douloureuse) que les sous-requêtes n'étaient pas supportées dans MySQL 3.23, ce qui rendait particulièrement pénible la migration d'une application d'Oracle 8 vers MySQL 3.23.
Oh et btw ... aucun intérêt à personne en particulier, le moteur SGBD Teradata NE ont une extension qui permet le mot-clé NOMMÉ à la place du mot-clé AS, et une expression nommée CAN être référencé ailleurs dans la requête, y compris la clause WHERE, la clause GROUP BY et la clause ORDER BY. Shuh-weeeet
Pourquoi un gourou du serveur SQL sait-il si cette syntaxe fonctionne dans MySQL? Ce sont deux systèmes de bases de données complètement différents. –
Il veut savoir si une requête sqlserver a un équivalent dans mysql. La meilleure personne à demander serait quelqu'un qui a utilisé les deux. Je doute que tout cela soit inhabituel - j'ai utilisé les deux. Malheureusement, je n'ai pas d'instance mysql sous mon contrôle, donc je me sentirais mal à l'aise de soumettre une réponse sans la vérifier sur une table de test. De toute façon, je ne pense pas que ce soit votre place pour poser cette question, surtout quand il est clair de sa question qu'il a besoin d'une version mysql d'une requête sqlserver. –
Sûr semble qu'il veut une version SQL Server d'un querry MySQL ... – CSharpAtl