问题描述
我已将此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条语句