-------------------------
SELECT * FROM  (SELECT T.DEVICE_NUMBER,T.ORD_PROV_ID,T.CHANNEL_ID,T.OPERATE_TYPE,T.MAIN_PROD_ID,T.CURR_PROD_ID,T.ORDER_PROD_ID,T.SERVICE_TYPE,T.PAY_MODE
  FROM ZB_SRC.ZB_D_ECDWAL04001_000 T ) A,  ECS_MB_FLUXPACK B
 WHERE A.SERVICE_TYPE =B.SERVICE_TYPE
 AND     A.CURR_PROD_ID = B.FLUXPACK_NO(+)
 AND     B.FLUXPACK_NO IS NULL;---------------------------
SELECT * FROM  (SELECT T.DEVICE_NUMBER,T.ORD_PROV_ID,T.CHANNEL_ID,T.OPERATE_TYPE,T.MAIN_PROD_ID,T.CURR_PROD_ID,T.ORDER_PROD_ID,T.SERVICE_TYPE,T.PAY_MODE
  FROM ZB_SRC.ZB_D_ECDWAL04001_000 T) A,  ECS_MB_FLUXPACK B
 WHERE A.SERVICE_TYPE =B.SERVICE_TYPE
 AND     A.ORDER_PROD_ID = B.FLUXPACK_NO(+) 
 AND     B.FLUXPACK_NO IS NULL;
红色的是表ZB_SRC.ZB_D_ECDWAL04001_000的两个字段 需要关联一下ECS_MB_FLUXPACK表中的FLUXPACK_NO有没有一种可能将这两种查询和在一起 不用 union all 谢谢

解决方案 »

  1.   

    疑问:
    1,SELECT的字段中,没有B表的字段,所以
      A.CURR_PROD_ID  = B.FLUXPACK_NO(+)及 
      A.ORDER_PROD_ID = B.FLUXPACK_NO(+) 
     这两个条件没有意义,除非你要显示空记录。2,使用UNION ALL 可能出现完全重复的记录。
      如果希望得到的是 UNION 的效果(重复记录合并)如下SQL。SELECT T.DEVICE_NUMBER,
           T.ORD_PROV_ID,
           T.CHANNEL_ID,
           T.OPERATE_TYPE,
           T.MAIN_PROD_ID,
           T.CURR_PROD_ID,
           T.ORDER_PROD_ID,
           T.SERVICE_TYPE,
           T.PAY_MODE
      FROM ZB_SRC.ZB_D_ECDWAL04001_000 T
     WHERE EXISTS ( SELECT 1 
                      FROM ECS_MB_FLUXPACK B
                     WHERE B.SERVICE_TYPE = T.SERVICE_TYPE
                       AND B.FLUXPACK_NO IS NULL )
      

  2.   

    3.你可能的需求是
    SELECT T.DEVICE_NUMBER,
           T.ORD_PROV_ID,
           T.CHANNEL_ID,
           T.OPERATE_TYPE,
           T.MAIN_PROD_ID,
           T.CURR_PROD_ID,
           T.ORDER_PROD_ID,
           T.SERVICE_TYPE,
           T.PAY_MODE
      FROM ZB_SRC.ZB_D_ECDWAL04001_000 T
     WHERE EXISTS ( SELECT 1  
                      FROM ECS_MB_FLUXPACK B
                     WHERE B.SERVICE_TYPE = T.SERVICE_TYPE
                       AND B.FLUXPACK_NO IS NULL
                       AND (   B.FLUXPACK_NO = A.ORDER_PROD_ID
                            OR B.FLUXPACK_NO = A.CURR_PROD_ID)
                  )
      

  3.   

    SELECT T.DEVICE_NUMBER,
       T.ORD_PROV_ID,
       T.CHANNEL_ID,
       T.OPERATE_TYPE,
       T.MAIN_PROD_ID,
       T.CURR_PROD_ID,
       T.ORDER_PROD_ID,
       T.SERVICE_TYPE,
       T.PAY_MODE
       FROM ZB_SRC.ZB_D_ECDWAL04001_000 T
      WHERE EXISTS ( SELECT 1   
      FROM ECS_MB_FLUXPACK B
       WHERE B.SERVICE_TYPE = T.SERVICE_TYPE
       AND B.FLUXPACK_NO IS NULL
       AND ( B.FLUXPACK_NO(+) = T.ORDER_PROD_ID
       OR B.FLUXPACK_NO(+) = T.CURR_PROD_ID)
       ) 是这个样子的 谢谢
      

  4.   

    追问一下 IN和OR 里面不能使用外连接吗 
      

  5.   

    为什么非要把+号去掉 你那样的话什么也没哟 
    因为B.FLUXPACK_NO = T.ORDER_PROD_ID 并且B.FLUXPACK_NO IS NULL 你觉得这样会出结果吗 
    我加上(+)是为了取ORDER_PROD_ID 有但是FLUXPACK_NO 不存在的记录 。
      

  6.   

    哈!FLUXPACK_NO IS NULL在我的盲点处,其实,你的需求我都是猜的,包括下面的语句,你能用数据说明问题吗?
    SELECT T.DEVICE_NUMBER,
       T.ORD_PROV_ID,
       T.CHANNEL_ID,
       T.OPERATE_TYPE,
       T.MAIN_PROD_ID,
       T.CURR_PROD_ID,
       T.ORDER_PROD_ID,
       T.SERVICE_TYPE,
       T.PAY_MODE
       FROM ZB_SRC.ZB_D_ECDWAL04001_000 T
      WHERE EXISTS ( SELECT 1   
      FROM ECS_MB_FLUXPACK B
       WHERE B.SERVICE_TYPE = T.SERVICE_TYPE
       AND ( NVL(B.FLUXPACK_NO,T.ORDER_PROD_ID) = T.ORDER_PROD_ID
          OR NVL(B.FLUXPACK_NO,T.CURR_PROD_ID ) = T.CURR_PROD_ID )
       )