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,但是 distinct
和 trim
有点令人担忧 - 如果确实需要它们,那么它变得有点复杂,您需要 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 (+)
外部联接运算符。
我在 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,但是 distinct
和 trim
有点令人担忧 - 如果确实需要它们,那么它变得有点复杂,您需要 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 (+)
外部联接运算符。