ORA-01427: 单行子查询 returns 超过一行 - 需要多个值

ORA-01427: single-row subquery returns more than one row- multiple values needed

我在 Oracle

上有以下 SQL 查询
SELECT 
  CASE
    WHEN (SELECT DISTINCT(trim(z.m_base_acct))
      FROM acc_mapping_rep z
      WHERE z.m_dyn_acct=b.m_en_credit
      AND z.M_REF_DATA  =b.M_REF_DATA) IN 'SAMANOS'
    THEN '7200000888001X'

  END AS M_EN_CRDR

FROM 
acc_journal_rep b
AND b.m_ref_data       = 41091
AND b.m_en_date        = '21-SEP-15'
AND b.m_entity         = 'LN'
AND b.m_nb_trn         = 0

我遇到了 oracle 错误 ORA-01427。由于我知道我确实使用了 IN 运算符而不是 equal 的情况。 请指教。我需要在 case 条件下有多个值。

如果如您所示只有一个值可以比较,'SAMANOS',那么您可以交换条件:

SELECT 
  CASE
    WHEN 'SAMANOS' IN (SELECT DISTINCT(trim(z.m_base_acct))
      FROM acc_mapping_rep z
      WHERE z.m_dyn_acct=b.m_en_credit
      AND z.M_REF_DATA  =b.M_REF_DATA)
    THEN '7200000888001X'
  END AS M_EN_CRDR
...

您也可以 left-join 到 acc_mapping_rep table,但是 distincttrim 有点令人担忧 - 如果确实需要它们,那么它变得有点复杂,您需要 left-join 到 table.

的内联视图

b.m_en_date = '21-SEP-15'也令人担忧;如果 m_en_date 是 DATE 列,那么您依赖于隐式转换和您的会话 NLS 设置。最好使用 to_date(),或者使用固定值日期文字:b.m_en_date = date '2015-09-21'.

您原来的较长代码也将受益于使用 ANSI 联接而不是旧的 Oracle-specific (+) 外部联接运算符。