Est-il possible de faire quelque chose de similaire à ce qui suit dans SQL Server 2012?
IF EXISTS (
WITH DATA AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY column ORDER BY Column) AS rn
FROM table )
SELECT *
FROM DATA
WHERE rn = 2 )
BEGIN
...
END
J'ai essayé d'utiliser cette syntaxe et j'ai reçu une erreur. Si cela n'est pas possible, l'utilisation d'une table temporaire serait-elle la meilleure façon d'y parvenir?
sql-server
cte
Weston Sankey
la source
la source
IF EXISTS (SELECT * FROM table)
?WHERE rn = 2
IF EXISTS (SELECT column FROM dbo.table GROUP BY column HAVING COUNT(*)>1)
Réponses:
Un CTE ne peut pas être utilisé comme sous-requête. Une solution de contournement serait:
Un autre serait:
Même si votre syntaxe proposée était valide, le
EXISTS
court-circuit ne serait pas dans ce cas de toute façon, je pense (et je soupçonne que c'est pourquoi vous voudriez l'utiliser), car la fonction de fenêtre doit se matérialiser sur l'ensemble complet avant dern
pouvoir être filtré.la source
Une autre option consiste à utiliser une variable:
la source
Je pense que vous pouvez utiliser du code comme celui-ci:
Le résultat de la condition peut être stocké sous forme de variable.
la source