在何时使用存在语句的情况

Har*_*iya 14 sql sql-server sql-server-2008

我正在创建一个带有WHERE CASE WHEN语句的SQL查询.我做错了什么并且得到了错误.

我的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)
Run Code Online (Sandbox Code Playgroud)

我收到错误了

消息512,级别16,状态1,行11
子查询返回的值超过1.当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做.

请帮助成功运行查询.我的逻辑是检查AreaId每行的条件(语句).

我想只选择行

  1. 公司已通过订阅进入AreaSubscription特定区域@AreaId
  2. AreaSubscription没有订阅条目然后评估AreaId(SELECT [@Areas].AreaId FROM @Areas)

Nit*_*esh 21

这可能对你有所帮助.

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)
Run Code Online (Sandbox Code Playgroud)

还有一个解决方案

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)
)
Run Code Online (Sandbox Code Playgroud)