2013-08-07 30 views
8

Tôi đang tạo truy vấn SQL có câu lệnh WHERE CASE WHEN. Tôi đang làm điều gì đó sai và nhận được lỗi.WHERE CASE WHEN statement with Exists

câu lệnh SQL của tôi là như

DECLARE @AreaId INT = 2 
DECLARE @Areas Table(AreaId int) 

INSERT INTO @Areas SELECT AreaId 
FROM AreaMaster 
WHERE CityZoneId IN (SELECT CityZoneId FROM AreaMaster WHERE AreaId = @AreaID) 

SELECT * 
FROM dbo.CompanyMaster 
WHERE AreaId IN 
    (CASE WHEN EXISTS (SELECT BusinessId 
         FROM dbo.AreaSubscription 
         WHERE AreaSubscription.BusinessId = CompanyMaster.BusinessId) 
      THEN @AreaId 
      ELSE (SELECT [@Areas].AreaId FROM @Areas) 
     END) 

Tôi nhận được lỗi như

Msg 512, Level 16, State 1, Line 11
Subquery trở lại hơn 1 giá trị. Điều này không được phép khi truy vấn con theo sau =,! =, <, < =,>,> = hoặc khi truy vấn phụ được sử dụng dưới dạng biểu thức .

Vui lòng trợ giúp để chạy truy vấn thành công. Logic của tôi là kiểm tra điều kiện AreaId trong (câu lệnh) cho mỗi hàng.

Tôi muốn chọn hàng chỉ khi

  1. công ty có nhập thuê bao vào AreaSubscription cho khu vực cụ thể thông qua @AreaId
  2. bảng AreaSubscription không có entry thuê bao sau đó đánh giá AreaId trong (SELECT [@Areas].AreaId FROM @Areas)
+0

'SELECT [@Areas] .AreaId FROM @ Areas' này có trả về nhiều giá trị không? – Nithesh

+0

Có nó trả về danh sách các khu vực mà tôi đã tạo trước đó trong truy vấn. –

+0

tôi nghĩ rằng ngoại lệ subquery là có. Điều gì về kết quả của '(SELECT BusinessId FROM dbo.AreaSubscription WHERE AreaSubscription.BusinessId = CompanyMaster.BusinessId)'? nhiều? – Nithesh

Trả lời

14

Điều này có thể giúp bạn.

SELECT * FROM dbo.CompanyMaster 
WHERE AreaId= 
(CASE WHEN EXISTS (SELECT BusinessId 
        FROM dbo.AreaSubscription 
        WHERE AreaSubscription.BusinessId = CompanyMaster.BusinessId) 
     THEN @AreaId ELSE AreaId END) 
AND AreaId IN (SELECT [@Areas].AreaId FROM @Areas) 

Thêm một giải pháp là

SELECT * FROM dbo.CompanyMaster A 
LEFT JOIN @Areas B ON A.AreaId=B.AreaID 
WHERE A.AreaId= 
(CASE WHEN EXISTS (SELECT BusinessId 
        FROM dbo.AreaSubscription 
        WHERE AreaSubscription.BusinessId = CompanyMaster.BusinessId) 
     THEN @AreaId ELSE B.AreaId END) 
) 
+0

Tôi muốn đánh giá trạng thái cho mỗi hàng .. điều này không hiệu quả đối với tôi .... –

+0

bạn có thể kiểm tra số thứ hai – Nithesh

+0

Cú pháp không chính xác .. –

0

Thử đặt SELECT lên trên 1 [@Areas] .AreaId FROM @Areas nếu nó giải quyết được vấn đề ..

+0

Tôi cần kiểm tra AreaId trong (tất cả các khu vực), Vì vậy, tôi không thể đặt đầu 1 cho tuyên bố đó quá ... –

0

Hãy thử điều này

DECLARE @AreaId INT = 2 
DECLARE @Areas Table(AreaId int) 

INSERT INTO @Areas 
SELECT AreaId FROM AreaMaster 
WHERE CityZoneId IN (SELECT CityZoneId FROM AreaMaster WHERE AreaId = @AreaID) 

    IF EXISTS (SELECT BusinessId 
     FROM dbo.AreaSubscription 
     WHERE AreaSubscription.BusinessId = CompanyMaster.BusinessId) 
    BEGIN 
     SELECT * FROM dbo.CompanyMaster 
     WHERE AreaId IN (@AreaId) 
    END 
    ELSE 
    BEGIN 
     SELECT * FROM dbo.CompanyMaster 
     WHERE AreaId IN (SELECT [@Areas].AreaId FROM @Areas) 
    END 
+1

lol, chỉ cần làm điều tương tự .. ..Bạn có câu trả lời – twoleggedhorse

+0

Đây không phải là những gì tôi đang tìm kiếm, Vui lòng đọc câu hỏi cẩn thận. –

+0

@HareshAmbaliyae kiểm tra cập nhật – bvr

0

thử này;

DECLARE @AreaId INT = 2 
    DECLARE @Areas Table(AreaId int) 

    INSERT INTO @Areas SELECT AreaId 
    FROM AreaMaster 
    WHERE CityZoneId IN (SELECT CityZoneId FROM AreaMaster WHERE AreaId = @AreaID) 

    INSERT INTO @Areas 
    SELECT AreaSubscription.BusinessId 
     FROM dbo.AreaSubscription INNER join CompanyMaster 
     ON AreaSubscription.BusinessId = CompanyMaster.BusinessId 

    SELECT * FROM dbo.CompanyMaster 
    WHERE AreaId IN (SELECT DISTINCT [@Areas].AreaId FROM @Areas) 
Các vấn đề liên quan