2013-08-07 13 views
8

Tworzę zapytanie SQL z instrukcją WHERE CASE WHEN. Robię coś złego i dostaję błąd.WHERE CASE KIEDY oświadczenie z Exists

My SQL jest jak

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) 

otrzymuję błąd jak

Msg 512, Level 16, State 1, wiersz 11
Podkwerenda zwrócone więcej niż 1 wartość. Nie jest to dozwolone, gdy podzapytanie jest następujące: =,! =, <, < =,>,> = lub gdy podzapytanie jest używane jako wyrażenie .

Pomóż z powodzeniem uruchomić zapytanie. Moja logika polega na sprawdzeniu warunkowego AreaId w (instrukcja) dla każdego wiersza.

Chcę zaznaczyć wiersz tylko wtedy, gdy

  1. Firma posiada wpis subskrypcji do AreaSubscription dla określonego obszaru przeszła przez @AreaId
  2. tabeli AreaSubscription nie posiada wpisu subskrypcji następnie ocenić AreaId w (SELECT [@Areas].AreaId FROM @Areas)
+0

'SELECT [@Areas] .AreaId FROM @ Areas' to jest to, że zwraca wiele wartości? – Nithesh

+0

Tak, zwraca listę obszarów, które wcześniej utworzyłem w zapytaniu. –

+0

Myślę, że wyjątek podkwerendy jest tam. A co z wynikiem '(SELECT BusinessId FROM dbo.AreaSubscription WHERE AreaSubscription.BusinessId = CompanyMaster.BusinessId)'? wielokrotność? – Nithesh

Odpowiedz

14

To może pomóc.

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) 

Jeszcze rozwiązaniem jest

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

Chcę ocenić stan dla każdego wiersza .. to nie działa dla mnie .... –

+0

można sprawdzić drugi – Nithesh

+0

Niepoprawna składnia .. –

0

Spróbuj umieścić SELECT top 1 [@Areas] .AreaId FROM @Areas, jeśli rozwiąże problem.

+0

Muszę sprawdzić AreaId w (wszystkie obszary), więc nie mogę umieścić top 1 również w tym oświadczeniu .... –

0

Spróbuj

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, po prostu zrobić to samo .. .. Masz odpowiedź: – twoleggedhorse

+0

To nie jest to, czego szukam. Przeczytaj uważnie pytanie. –

+0

@HareshAmbaliyae sprawdź zaktualizowany – bvr

0

spróbować;

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)