ORA-01427:单行子查询返回多个行 - 需要多个值

时间:2016-01-07 16:16:27

标签: sql oracle11g operators row oracle-sqldeveloper

我在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运算符放在了相同的情况下我有一个案例。 请指教。我需要在案例条件中有多个值。

1 个答案:

答案 0 :(得分:2)

如果您已经展示了只有一个要比较的值'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
...

您也可以左键加入acc_mapping_rep表格,但distincttrim稍微有点担心 - 如果真的需要这些,那么它会变得有点复杂而你呢? d需要左连接到该表的内联视图。

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

原始的较长代码也可以从使用ANSI连接而不是旧的Oracle特定(+)外连接运算符中受益。