【问题标题】:Based on some condition need to use different Join根据某些条件需要使用不同的Join
【发布时间】:2023-04-11 01:13:01
【问题描述】:

我们在 SQL 查询中传递了一些参数。 如果这些参数中的任何一个不为空,那么我们正在设置一个值。 基于该值,我必须使用不同的连接来连接两个表。 请在下面找到代码:

WITH check_fliter
     AS (SELECT CASE
                   WHEN    &protocol_Id IS NOT NULL
                        OR &order_status IS NOT NULL
                        OR &order_Id IS NOT NULL
                        OR &start_date IS NOT NULL
                        OR &end_date IS NOT NULL
                        OR &source_system IS NOT NULL
                   THEN
                      'Y'
                   ELSE
                      'N'
                END
                   CSDS_ONLY
           FROM DUAL)
SELECT co.order_id,
       im.object_key_n,
       last_date_modified,
       source_org_system_id
  FROM csds_prod_owner.inbound_message im
 (CASE WHEN CSDS_ONLY = 'Y'
       THEN
            JOIN ctds_order co
            ON im.object_key_n = co.order_id
 ELSE
      LEFT OUTER JOIN  ctds_order co
           ON (im.object_key_n = decode(co.non_csds_order,'Y',DECODE( TRANSLATE(co.source_order_id,'0123456789',' '), NULL, co.source_order_id,-1),co.order_id))
 END)

当我尝试执行此查询时,我收到以下错误消息。 ORA-00933: SQL 命令未正确结束

谁能帮帮我?

【问题讨论】:

    标签: sql oracle join case


    【解决方案1】:

    如果我理解正确,您可以同时使用LEFT JOIN,然后在WHERE 子句中转换回INNER JOIN

    SELECT . . .
    FROM csds_prod_owner.inbound_message im LEFT JOIN
         ctds_order co
         ON (CSDS_ONLY = 'Y' and im.object_key_n = co.order_id) or
            (CSDS_ONLY <> 'Y' and (im.object_key_n = decode(co.non_csds_order, 'Y', DECODE( TRANSLATE(co.source_order_id,'0123456789',' '), NULL, co.source_order_id,-1),co.order_id))
    WHERE CSDS_ONLY <> 'Y' OR co.order_id is not null
    

    我应该补充一点,我不太赞成decode(),因为case 声明更容易理解。但是,我不会修改您代码的这方面。

    【讨论】:

      猜你喜欢
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2015-07-01
      • 1970-01-01
      • 2015-04-29
      • 2020-09-28
      • 1970-01-01
      相关资源
      最近更新 更多