2013-08-07 89 views
8

我正在創建一個具有WHERE CASE WHEN語句的SQL查詢。我做錯了什麼,並得到錯誤。WHERE CASE WHEN與存在語句

我的SQL語句就像

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) 

我得到錯誤的

消息512,級別16,狀態1,行11
子查詢返回多個值。這在子查詢 如下時不允許=,!=,<,< =,>,> =,或當子查詢用作 表達。

請幫助成功運行查詢。我的邏輯是在每行的(語句)中檢查條件AreaId

我想選擇該行,只有當

  1. 公司擁有訂閱進入AreaSubscription@AreaId
  2. AreaSubscription通過沒有訂閱條目的特定區域,然後在(SELECT [@Areas].AreaId FROM @Areas)
+0

'SELECT [@Areas] .AreaId FROM @ Areas'是否返回多個值? – Nithesh

+0

是的,它返回我在查詢之前創建的區域列表。 –

+0

我認爲子查詢例外就在那裏。 '(SELECT BusinessId FROM dbo.AreaSubscription WHERE AreaSubscription.BusinessId = CompanyMaster.BusinessId)''?多? – Nithesh

回答

14

這可能會幫助你。

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) 

還有一個解決辦法是

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

我想評估每一行的狀態..這對我不起作用.... –

+0

你可以檢查第二個 – Nithesh

+0

語法不正確。 –

0
評估 AreaId

嘗試將SELECT top 1 [@Areas] .AreaId從@Areas解決該問題。

+0

我需要檢查AreaId(所有區域),所以我不能把頂部1也放在那個語句中...... –

0

試試這個

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

哈哈,剛做完同樣的事情.. ..你有答案 – twoleggedhorse

+0

這不是我要找的,請仔細閱讀問題。 –

+0

@HareshAmbaliyae檢查更新的人 – bvr

0

試試這個;

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)