两张表:
Depart表
Channel表Depart表的主键是depart_id,而且还包含字段Channel_id,
一个Channel_id一定对应一个depart_id,但是depart_id可以不对应到Channel_id。
读取一个文件,里面包含Channel_id,
现在我要写存储过程,将Channel表和Depart表关联,对数据一条一条进行处理。
代码参考:
FOR v_Main IN
            (
                SELECT
                    c.CONSIGNMENT_NO,
                    c.CONSIGNMENT_DATE,
                    t.EPARCHY_CODE,
                    t.DEPART_ID,
                    c.CHANNEL_ID
                FROM
                    Depart t,
                    Channel c
                WHERE
                    t.channel_id = c.transto_channel
            ) LOOP            ...
END LOOP但是,文件中的Channel_id并不会一定都是在depart表中,如果我想以depart表的数据为准,
则使用左连接即可。但问题是我想在这个过程中知道哪些Channel_id是不在Depart表中的,如果在此过程得到这些不在depart表中的Channel_Id的数据呢?如果跳出Loop后可以再检索一次,用not exists 可以取得这些记录,但太麻烦,看有没有一举两得的方法。

解决方案 »

  1.   

    t.channel_id = c.transto_channel
    不用channel_id关联的?
      

  2.   

    不是很明白
    是不是这样
    FOR v_Main IN 
                ( 
                    SELECT 
                        c.CONSIGNMENT_NO, 
                        c.CONSIGNMENT_DATE, 
                        t.EPARCHY_CODE, 
                        t.DEPART_ID, 
                        c.CHANNEL_ID,
                        case when t.channel_id is null then 0 else 1 end flag 
                    FROM 
                        Depart t, 
                        Channel c 
                    WHERE 
                        t.channel_id(+) = c.transto_channel 
                ) LOOP             ... 
    END LOOP 
      

  3.   

    transto_channel 也就是表 c里的channel_id,写错了而已。
      

  4.   

    FOR v_Main IN
                (
                    SELECT
                        c.CONSIGNMENT_NO,
                        c.CONSIGNMENT_DATE,
                        c.transto_channel,
                        t.EPARCHY_CODE,
                        t.DEPART_ID,
                        t.channel_id
                    FROM
                        Depart t left join 
                        Channel c
                        on t.channel_id = c.transto_channel
                ) LOOPEND LOOP如果游标返回的transto_channel为空则说明t.channel_id在Channel不存在
      

  5.   


    这里会返回transto_channel为空的记录吗?
    都一定是有值的了吧
      

  6.   

    SELECT 
       c.CONSIGNMENT_NO, 
       c.CONSIGNMENT_DATE, 
       t.EPARCHY_CODE, 
       t.DEPART_ID, 
       c.CHANNEL_ID,
       1 flag 
    FROM 
       Depart t, 
       Channel c 
    WHERE 
       t.channel_id = c.transto_channel(+)
    union 
    SELECT 
       c.CONSIGNMENT_NO, 
       c.CONSIGNMENT_DATE, 
       t.EPARCHY_CODE, 
       t.DEPART_ID, 
       c.CHANNEL_ID,
       case when t.DEPART_ID is null then 0 else 1 flag 
    FROM 
       Depart t, 
       Channel c 
    WHERE 
       t.channel_id(+) = c.transto_channel;   
       循环时判断,flag 是1的存在,0的不存在
      

  7.   

    SELECT 
    'Channel_id是在Depart表中' cunzai,
      c.CONSIGNMENT_NO, 
      c.CONSIGNMENT_DATE, 
      t.EPARCHY_CODE, 
      t.DEPART_ID, 
      c.CHANNEL_ID, 
    FROM 
      Depart t, 
      Channel c 
    WHERE 
      t.channel_id = c.transto_channel(+) 
    union 
    SELECT 
    'Channel_id是不在Depart表中' cunzai,
      c.CONSIGNMENT_NO, 
      c.CONSIGNMENT_DATE, 
      '' as EPARCHY_CODE, 
      '' as DEPART_ID, 
      c.CHANNEL_ID, 
    FROM 
      Depart t, 
      Channel c 
    WHERE 
       c.Channel_id not in(select Channel_id from Depart)