0

我相信 ELSE 中的 SELECT 语句也是可能的,对吧?

我有这个查询:

CASE ORDER1
        WHEN NULL
            THEN ''
        ELSE (
                SELECT P.VENDOR_ID
                FROM ORDERS1${RGCM_CAMP_LOGIC_SUFFIX} P
                LEFT JOIN ORDERS2${RGCM_CAMP_LOGIC_SUFFIX} O
                    ON P.CUSTOMER_ID = O.CUSTOMER_ID
                WHERE P.ORDER_DATE = O.ORDER1
                )
        END AS VENDOR_ID1

我很确定,子查询只返回 1 行我仍然收到错误:ORA-01427:单行子查询返回多于一行

我正在检查是否有任何 ORDER1,则应选择其 VENDOR_ID 并将其称为 VENDOR_ID1。

我在哪里做错了?

4

2 回答 2

1

利用

 - SELECT MAX(P.VENDOR_ID)  or
 - SELECT TOP 1 P.VENDOR_ID
于 2013-10-04T11:00:56.083 回答
0

您对 case 表达式的重写给出了 ORA 错误,因为您忘记了 IS NULL

ORDER1 为的情况

但是:我不建议在 select 子句中使用相关子查询 - 似乎是一种非常低效的方法 - 即使它在 case 表达式中也是如此。

这里没有足够的整体查询来确切地知道要提出什么建议,但是您应该将该逻辑移动到连接中,就像这样

LEFT JOIN (
SELECT CUSTOMER_ID
    , ORDER_DATE
    , VENDOR_ID
FROM ORDERS16F50TQDWsb
) P ON O.CUSTOMER_ID = P.CUSTOMER_ID
AND O.ORDER1 = P.ORDER_DATE

请注意,您可能必须在此处使用 GROUP BY 以免获得比预期更多的行,但如果您确实需要这样做,那么您可能还必须酌情使用 MAX(ORDER_DATE) [或 MIN()] . 只有更详细地了解您的整体查询,我才能更准确。

一旦你弄清楚你是如何收集这些信息的,那么你的案例表达就会简单得多:

CASE WHEN ORDER1 IS NULL THEN '' ELSE P.VENDOR_ID END AS VENDOR_ID1,

并且,您需要确保 VENDOR_ID1 的日期类型是字符串,而不是必须使用 to_char(VENDOR_ID1) 以便它与该空字符串兼容。

最后,您当然可以使用等号运算符比较日期;但数据可能不相等,例如可能存在几秒或几分钟的差异。可能需要截断日期以消除该问题,例如

TRUNC(O.ORDER1) = TRUNC(P.ORDER_DATE)

但只有这样做才是真正需要的,否则你会在那些 TRUNC() 函数上浪费精力。

于 2013-10-04T11:39:14.870 回答