Menggunakan CTE di IF EXISTS Query

8

Apakah mungkin untuk melakukan sesuatu yang mirip dengan yang berikut ini di 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

Saya mencoba menggunakan sintaks ini dan menerima kesalahan. Jika ini tidak memungkinkan, apakah menggunakan tabel temp akan menjadi cara terbaik untuk mencapai ini?

Weston Sankey
sumber
Dari BOL - Pedoman untuk Membuat dan Menggunakan Ekspresi Common Table , Anda tidak bisa. Yang terbaik adalah menggunakan tabel temp .
Kin Shah
Mengapa tidak IF EXISTS (SELECT * FROM table)?
ypercubeᵀᴹ
@ ypercube Contoh yang saya berikan bukan replika yang tepat dari pertanyaan yang saya kerjakan - melihat apakah tabel memiliki baris tidak akan cukup dalam apa yang saya coba. Saya kira itu akan lebih akurat untuk mengatakanWHERE rn = 2
Weston Sankey
1
Maka Anda juga bisa mengatakanIF EXISTS (SELECT column FROM dbo.table GROUP BY column HAVING COUNT(*)>1)
Aaron Bertrand

Jawaban:

10

CTE tidak dapat digunakan sebagai subquery. Satu solusi adalah:

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

Yang lain adalah:

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

Bahkan jika sintaks yang Anda usulkan valid, EXISTStoh tidak akan terjadi korsleting dalam kasus itu, saya akan berpikir (dan saya curiga itu sebabnya Anda ingin menggunakannya), karena fungsi jendela harus terwujud pada set lengkap sebelum rndapat disaring.

Aaron Bertrand
sumber
4

Pilihan lain adalah menggunakan variabel:

DECLARE @HasRows bit = 0;

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

IF @HasRows
BEGIN
    PRINT 'True';
END
Mitch
sumber
2

Saya pikir Anda dapat menggunakan kode seperti ini:

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 

Hasil kondisi dapat disimpan sebagai variabel.

Sergey Shoshin
sumber