【问题标题】:MS SQL (SAP B1) "Only one expression can be specified in the select list when the subquery is not introduced with EXISTS..."MS SQL (SAP B1) “当子查询没有用 EXISTS 引入时,只能在选择列表中指定一个表达式...”
【发布时间】:2020-11-10 13:58:23
【问题描述】:

我已经为 SAP B1 数据库使用了这个 SQL 查询,它应该运行不同的查询取决于用户的组:

    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 case when 1=2 then 'a' else (select 1,2) end 你不能这样使用 CASE。您能用示例数据和预期结果解释您要达到的目标吗?
  • 我将此查询用于 SAP B1(服务调用)中的格式化搜索:在字段 ItemCode 字段中,当用户键入项目代码并点击 Tab 时,查询应显示结果列表,取决于在用户组上: - 第 2 组:替代(BP 代码)、ItemCode、ItemName - 第 4 组:ItemCode、ItemName。

标签: sql sql-server sapb1


【解决方案1】:

你不能这样写 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 语句,然后只执行那一条语句

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2017-07-27
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多