MS SQLSAP B1“当未使用EXISTS引入子查询时,在选择列表中只能指定一个表达式...”

问题描述

我已将此SQL查询用于SAP B1数据库,该数据库应根据用户组运行不同的查询

    SELECT CASE
           WHEN T0.GroupId = '2'
           THEN
(
    SELECT T0.Substitute,T0.ItemCode,T1.ItemName
    FROM OSCN T0
         INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
    WHERE T0.CardCode = 'CV-1234'
)
           ELSE(CASE
                    WHEN(T0.GroupId = '4')
                    THEN
(
    SELECT T0.ItemCode
    FROM OSCN T0
    WHERE T0.CardCode = 'CV-1234'
)
                    ELSE ''
                END)
       END
FROM OUGR T0
     INNER JOIN USR7 T1 ON T1.UserId = T1.UserId
WHERE T1.UserId = 'George'

但是当我运行它时,出现一个错误“当未将EXISTS引入子查询时,只能在选择列表中指定一个表达式”。

感谢任何帮助。 预先感谢。

解决方法

您不能像这样编写SQL。如果您考虑一个非常简单的SQL模板:

SELECT a,b
FROM table1
WHERE x = y;

a和b只能是单个值;如果您考虑一下,让“ a”对应多个值(我的意思是多个列)是没有意义的。没有动态SQL之类的东西,SQL语句的结构(或其结果的结构)在执行时是不确定的,也可能在行与行之间变化(可以动态构造SQL语句,但固定在点就执行了。

因此,您可以根据需要使用复杂的SQL替换'a',但该SQL必须始终产生单个值。

不知道您的SAPB1环境是否支持它,但是处理此类问题的通常方法是将其包装在代码中(Oracle中的PL / SQL,SQL Server中的T-SQL等)-因此您的代码确定要执行的CASE语句中的哪个SQL语句,然后只执行该1条语句