求助,A集合-B集合得到未用id,将此id再与C集合的记录拼接?

[复制链接]
查看11 | 回复4 | 2011-1-4 10:26:11 | 显示全部楼层 |阅读模式
t_A(是1..31间的值,简单起见简化为1..5)
all_id
1
2
3
4
5

t_B是当前实际使用的
ci current_id
ci1 2
ci1 1
ci1 4
ci3 2
ci4 3
ci4 2
ci4 1

t_c 是计划的
cicomment
ci1 txt1
ci1 txt2
ci3 txt3
ci4 txt4
ci4 txt5
ci4 txt6
ci6 txt6
t_f 是计划最终版(将还没有使用的id拼在记录b字段的后面)
ci
b
c1 txt1_3
c1 txt2_5
c3 txt3_1
ci4 txt4_4
ci4 txt5_5

第1步: 找出t_B中每个ci所未使用过的id(从t_A的1..5个全部id中去除t_B中已经用过的已用id)
t_d
ci remain_id
ci13
ci15
ci31
ci33
ci34
ci35
ci44
ci45
第2步: 将第1步得到的未用id,按ci安排给t_C计划表,作拼接.得到t_f最终计划表
有可能未用的remain_id多于t_c表需要的,也有可能少;每个表的ci多少也不一样
最终行数是各表中最少的ci行,最少的未用id。(也可以是t_c计划表的行数,但因当前表中无ci,少id的注明此行不可用也行),未用id使用顺序没限制,但最好是从小到大。得到t_f计划最终版


本来想用for in loop的,想了半天,以我水平还是实现不了,特求助高手们支招
[ 本帖最后由 blackantt 于 2011-4-24 22:39 编辑 ]
回复

使用道具 举报

千问 | 2011-1-4 10:26:11 | 显示全部楼层
WITH t1 AS (
SELECT t_b.ci,t_a.all_id,row_number() over(PARTITION BY t_b.ci ORDER BY t_a.all_id) rn
FROM t_a
LEFT JOIN t_b PARTITION BY (t_b.ci)
ON t_a.all_id = t_b.current_id
WHEREt_b.current_id IS NULL
),
t2 AS(
SELECT ci,comments,row_number() over(PARTITION BY ci ORDER BY comments) rn
FROM t_c
)
SELECT t2.ci,t2.comments||'_'||t1.all_id b
FROM t1,t2
WHERE t1.ci = t2.ci AND t1.rn = t2.rn
;
ci1txt1_3
ci1txt2_5
ci3txt3_1
ci4txt4_4
ci4txt5_5
回复

使用道具 举报

千问 | 2011-1-4 10:26:11 | 显示全部楼层
详细可以参考http://www.itpub.net/viewthread.php?tid=1332059&highlight=
回复

使用道具 举报

千问 | 2011-1-4 10:26:11 | 显示全部楼层
ok了,正在把自己的表套进去
不过要想看懂并活用这些东东,不是件容易的事
thanks for ding
回复

使用道具 举报

千问 | 2011-1-4 10:26:11 | 显示全部楼层
反复练习,当你各种类型的SQL需求,整上1000个,就有感觉了,前提是对oracle sql以及函数很熟悉,最起码知道有这玩意
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行