SQL查询问题中的案例声明

时间:2018-06-21 07:56:11

标签: sql sql-server

我正在尝试运行SQL查询,但是运行它时发生错误。

错误:

  

[代码:-811,SQL状态:21000]
  标量全查询,SELECT INTO语句或VALUES INTO语句的结果超过一行。.
  SQLCODE = -811,SQLSTATE = 21000,DRIVER = 4.19.49

这是我要运行的SQL查询,我相信我的CASE语句存在问题,我的解决方案已用完。请帮忙,非常感谢!

SELECT 
    ES.SHPMNT_REF,
    (CASE 
        WHEN (ES.SERVICE_PROVIDER_NAME) IS NULL
           THEN (SELECT BRDB.EXPORT_ONHAND.SERVICE_PROVIDER_NAME 
                 FROM BRDB.EXPORT_ONHAND 
                 WHERE BRDB.EXPORT_ONHAND.SHPMNT_REF = ES.SHPMNT_REF)
           ELSE (ES.SERVICE_PROVIDER_NAME)
     END) AS SP
FROM 
    BRDB.EXPORT_SHIPMENT ES
WHERE 
    ES.DATE_CREATE > CURRENT TIMESTAMP - 30 DAYS

3 个答案:

答案 0 :(得分:1)

我认为这就是你所追求的。加入您可能需要的表数据,然后让COALESCE检查是否为空,并获取其他数据。

SELECT 
    ES.SHPMNT_REF,
    COALESCE(ES.SERVICE_PROVIDER_NAME, OH.SERVICE_PROVIDER_NAME) AS SP
FROM BRDB.EXPORT_SHIPMENT ES
    LEFT JOIN BRDB.EXPORT_ONHAND AS OH 
        ON ES.SHPMNT_REF = OH.SHPMNT_REF
WHERE 
    ES.DATE_CREATE > CURRENT TIMESTAMP - 30 DAYS

答案 1 :(得分:0)

也许您应该放进箱子里

THEN (SELECT TOP 1 BRDB.EXPORT_ONHAND.SERVICE_PROVIDER_NAME

答案 2 :(得分:0)

由于您的子查询返回多个值而引发错误。 最好的方法是先连接两个表,然后在值为NULL时获取所需的值。 那应该起作用:

SELECT 
    ES.SHPMNT_REF
    ,CASE
       WHEN ES.SERVICE_PROVIDER_NAME IS NULL
         THEN EO.SERVICE_PROVIDER_NAME 
       ELSE ES.SERVICE_PROVIDER_NAME
     END AS 'SP'
FROM BRDB.EXPORT_SHIPMENT ES
LEFT JOIN BRDB.EXPORT_ONHAND EO
ON ES.SHPMNT_REF = EO.SHPMNT_REF

WHERE ES.DATE_CREATE > CURRENT TIMESTAMP - 30 DAYS