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
この構文を使用しようとすると、エラーが発生しました。これが不可能な場合、一時テーブルを使用することがこれを達成するための最良の方法でしょうか?
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
をフィルタリングする前に、フルセットを超えて。
別のオプションは変数を使用することです:
DECLARE @HasRows bit = 0;
WITH foo as
(
...
)
SELECT TOP(1) @HasRows = 1
FROM foo;
IF @HasRows
BEGIN
PRINT 'True';
END
次のようなコードを使用できると思います。
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
条件結果は変数として保存できます。