IF EXISTSクエリでのCTEの使用


8

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

この構文を使用しようとすると、エラーが発生しました。これが不可能な場合、一時テーブルを使用することがこれを達成するための最良の方法でしょうか?


BOL-共通テーブル式の作成と使用に関するガイドラインからはできません。一時テーブルを使用するのが最適です。
Kin Shah

なんでIF EXISTS (SELECT * FROM table)
ypercubeᵀᴹ

@ypercube私が提供した例は、私が使用しているクエリの正確なレプリカではありません-テーブルに行があるかどうかを確認すると、私が試みているものでは不十分です。私はそれがもっと正確だったと思いますWHERE rn = 2
Weston Sankey

1
そして、あなたも言うことができるIF EXISTS (SELECT column FROM dbo.table GROUP BY column HAVING COUNT(*)>1)
アーロン・ベルトラン

回答:


10

CTEはサブクエリとして使用できません。1つの回避策は次のとおりです。

IF EXISTS 
(
  SELECT 1 FROM 
  (
    SELECT ROW_NUMBER() OVER(PARTITION BY column ORDER BY Column) AS rn
    FROM table
  ) AS DATA 
  WHERE rn = 2
)
BEGIN
  ...
END

もう一つは:

IF EXISTS (SELECT 1 FROM dbo.table GROUP BY column HAVING COUNT(*) > 1)
BEGIN
  ...
END

あなたの提案構文が有効であったとしても、EXISTSウィンドウ関数は、前にフルセットの上に具現しなければならないので、とにかくその場合の短絡ではないだろう、私が思うだろう(と私はあなたがそれを使用したいと思います理由がある疑いがある)rn可能性フィルタリングされます。


4

別のオプションは変数を使用することです:

DECLARE @HasRows bit = 0;

WITH foo as 
(
    ...
)
SELECT TOP(1) @HasRows = 1
FROM foo;

IF @HasRows
BEGIN
    PRINT 'True';
END

2

次のようなコードを使用できると思います。

IF OBJECT_ID('tempdb..#data1') IS NOT NULL
            BEGIN 
                DROP TABLE #data1;
            END;

           CREATE TABLE #data1 (
id INT
)

IF OBJECT_ID('tempdb..#data2') IS NOT NULL
                BEGIN 
                    DROP TABLE #data2;
                END;

CREATE TABLE #data2 (
id INT
)

INSERT INTO #data1
VALUES (1), (2), (3), (4)

INSERT INTO #data2
VALUES (4), (5)

DECLARE @result INT = 0;


;WITH result_set AS (
SELECT id FROM #data1
  UNION 
SELECT id FROM #data2
)
SELECT @result = 1 FROM result_set WHERE id = 5 --6

IF (@result = 1)
BEGIN 
SELECT 'YAHOO'
END 

条件結果は変数として保存できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.