两张表:
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 可以取得这些记录,但太麻烦,看有没有一举两得的方法。
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 可以取得这些记录,但太麻烦,看有没有一举两得的方法。
不用channel_id关联的?
是不是这样
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
(
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不存在
这里会返回transto_channel为空的记录吗?
都一定是有值的了吧
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的不存在
'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)