MS SQL(SAP B1)";如果子查询没有使用EXISTS…“引入,则只能在选择列表中指定一个表达式;

MS SQL(SAP B1)";如果子查询没有使用EXISTS…“引入,则只能在选择列表中指定一个表达式;,sql,sql-server,sapb1,Sql,Sql Server,Sapb1,我已将此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.Ite

我已将此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时,在select列表中只能指定一个表达式”

谢谢你的帮助。
提前感谢。

您不能这样编写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语句

Simplified Repo
select CASE when 1=2,然后选择'a'else(select 1,2)end
您不能这样使用CASE。您能用示例数据和预期结果解释一下您试图实现的目标吗?我在SAP B1(服务调用)中使用此查询进行格式化搜索:在字段ItemCode字段中,当用户键入项目代码并点击Tab时,查询应显示结果列表,具体取决于用户的组:-组2:替换(BP代码),ItemCode,ItemName-第4组:ItemCode,ItemName。