Sử dụng CTE trong IF EXISTS Query


8

Có thể làm điều gì đó tương tự như sau trong SQL Server 2012 không?

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

Tôi đã thử sử dụng cú pháp này và nhận được một lỗi. Nếu điều này là không thể, sử dụng bảng tạm thời có phải là cách tốt nhất để thực hiện điều này?



Tại sao không IF EXISTS (SELECT * FROM table)?
ypercubeᵀᴹ

@ypercube Ví dụ tôi cung cấp không phải là bản sao chính xác của truy vấn tôi đang làm việc - xem các bảng có hàng không đủ trong những gì tôi đang cố gắng không. Tôi đoán nó sẽ chính xác hơn để nóiWHERE rn = 2
Weston Sankey

1
Sau đó, bạn cũng có thể nóiIF EXISTS (SELECT column FROM dbo.table GROUP BY column HAVING COUNT(*)>1)
Aaron Bertrand

Câu trả lời:


10

Một CTE không thể được sử dụng như một truy vấn con. Một cách giải quyết khác là:

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

Một cách khác là:

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

Ngay cả khi cú pháp đề xuất của bạn là hợp lệ, EXISTSdù sao đi nữa, tôi sẽ không bị đoản mạch (và tôi nghi ngờ đó là lý do tại sao bạn muốn sử dụng nó), vì chức năng cửa sổ phải thực hiện trên toàn bộ trước đó rncó thể được lọc.


4

Một tùy chọn khác là sử dụng một biến:

DECLARE @HasRows bit = 0;

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

IF @HasRows
BEGIN
    PRINT 'True';
END

2

Tôi nghĩ bạn có thể sử dụng mã như thế này:

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 

Kết quả điều kiện có thể được lưu trữ như một biến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.