【问题标题】:ORA-01427: single-row subquery returns more than one row- multiple values neededORA-01427: 单行子查询返回多行 - 需要多个值
【发布时间】:2016-01-07 16:16:26
【问题描述】:

我在 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 运算符而不是相等的情况。 请指教。我需要在 case 条件中有多个值。

【问题讨论】:

  • 如果您提供了一个最小化的示例或您的问题,这将更容易理解。我相信我看到了这个问题(IN 有一个值),但我真的不知道你实际上想要完成什么。
  • 好的,我会一分钟
  • 我想测试 case 条件中存在的 select 语句中的值(返回 3 行)并检查这些值是否等于值 SAMANOS 然后我希望该值为 7200000888001X @TomH
  • 我并不是说你不会得到答案,但这个问题需要消化很多。你能试着给我们一个问题的简单例子吗?你可以使用类似 www.sqlfiddle.com 的东西来演示。
  • 这样更好吗? @TomH

标签: sql oracle11g operators row oracle-sqldeveloper


【解决方案1】:

如果如您所见,您只有一个值要比较,'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 有点令人担忧 - 如果确实需要它们,那么它会变得有点复杂,您需要左连接到该表的内联视图。

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

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

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2017-11-02
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多