2013-08-07 23 views
8

WHERE CASE WHEN bildirimi olan bir SQL sorgusu oluşturuyorum. Yanlış bir şey yapıyorum ve hata alıyorum. BenVarolan Bildirimi

Msg 512, Level 16, State 1, Hat 11
olarak hatayı alıyorum

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) 

gibi

My SQL deyimi Alt sorgu 1'den fazla değer döndürdü olduğunu. Alt sorgu aşağıdaki = =, = <, < =,>,> = veya alt sorgu ifade olarak kullanıldığında alt sorguya izin verilmez.

Sorgunuzu başarılı bir şekilde çalıştırmak için lütfen yardım edin. Benim mantığım her satır için koşullu AreaId (ifade) kontrol etmektir.

Ben

  1. şirket abonelik girdi yok @AreaId
  2. masanın AreaSubscription geçti belirli alan için AreaSubscription içine abonelik girişi olduğunda sadece o (SELECT [@Areas].AreaId FROM @Areas)
+0

'SELECT [@Areas] .AreaId FROM @ Areas' bu dönüşü birden çok değer mi? – Nithesh

+0

Evet, daha önce oluşturduğum alanların listesini sorguya ver. –

+0

Sanırım alt sorgu istisnası var. (SELECT BusinessId FROM dbo.AreaSubscription WHERE AreaSubscription.BusinessId = CompanyMaster.BusinessId) 'ın sonucu nedir? Birden? – Nithesh

cevap

14

Bu size yardımcı olabilir deneyin.

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) 

Bir daha çözüm

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

Her satır için durumu değerlendirmek istiyorum .. bu benim için işe yaramıyor .... –

+0

ikinci bir – Nithesh

+0

Yanlış sözdizimi kontrol edebilirsiniz .. –

0
yılında AreaId değerlendirmek satır seçmek istiyor

SELECT top 1'i yerleştirmeyi deneyin [@Areas] .AreaId FROM @Sorunu çözüyorsa, o zaman ...

+0

(Ben tüm alanlarda) AreaId kontrol etmek gerekir, Bu yüzden ben de bu ifadeye ilk 1 koyamıyorum .... –

0

bu

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, sadece aynı şeyi bitti .. ..Bu yanıtınız var – twoleggedhorse

+0

Bu aradığım şey değil, Lütfen soruyu dikkatle okuyun. –

+0

@HareshAmbaliyae güncellenmiş bir kontrol edin – bvr

0

bu deneyin;