【问题标题】:Error - single-row subquery returns more than one row错误 - 单行子查询返回多于一行
【发布时间】:2020-06-18 22:57:54
【问题描述】:

我创建了一个表类型来将多个员工 ID 传递给我的过程。但是,有一个要求,如果没有向输入参数传递任何内容,则应检索所有员工。

已创建表类型 -

CREATE OR REPLACE TYPE EMP_LIST IS TABLE OF NUMBER;  

我写了下面的查询来检查空值,但它失败并出现错误 - ORA-01427:单行子查询返回多于一行

SELECT COL_LIST FROM  EMP
WHERE EMP_ID IN (CASE WHEN (SELECT COLUMN_VALUE FROM table(EMP_LIST())) IS NULL 
                THEN (SELECT EMP_ID FROM EMP) 
                ELSE (SELECT COLUMN_VALUE FROM table(EMP_LIST())) END)

CASE 不能返回多个值。有人可以建议一种替代方案或任何其他解决方案来处理这种情况吗?

谢谢。

【问题讨论】:

  • 也许emp_list 应该命名为number_list

标签: oracle plsql types


【解决方案1】:

如果你想使用这种类型你可以写:

with t as (SELECT COLUMN_VALUE cv FROM table(EMP_LIST()))
SELECT COL_LIST FROM EMP
  where emp_id in (select cv from t) 
     or (select count(1) from t) = 0

dbfiddle

编辑-解释:

with t as (SELECT COLUMN_VALUE cv FROM table(EMP_LIST()))

这部分称为CTE(公用表表达式)。它通常在主查询中需要子查询两次或更多次时使用,例如这里。

  where emp_id in (select cv from t) 

喜欢你的尝试(第一次使用 CTE)

     or (select count(1) from t) = 0

第二次使用 CTE。 WHERE 条件一起允许我们查看 CTE 中提供的列表中的行或所有行(如果提供的数字计数为零)。

你可以在没有 CTE 的情况下做到这一点,但这样你必须定义两次列表。

【讨论】:

  • 感谢您的回复。它工作得非常好!您能否解释一下这是如何工作的(从 t 中选择 count(1))= 0 :)
【解决方案2】:

在你的谓词中尝试这样的事情

((select count(0) from table(emp_list()))=0 and emp_id IN (
                SELECT
                    emp_id
                FROM
                    emp
            )
            )
 or emp_id in (
                SELECT
                    column_value
                FROM
                    TABLE ( emp_list() )
            )

【讨论】:

  • 感谢您的回复。我试过这个,但它给了我一个错误 - ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号”
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多