有点明白啥意思了,看看是这意思不? select NVL(A.C1,B.C1) C1, NVL(A.C2,B.C2) C2, NVL(A.C3,B.C3) C3, NVL(A.C4,B.C4) C4 …… FROM T A,T B WHERE A.id >B.id
假设你的表为T 这个表自关联,分别起别名为A和B 你把语句中的T改为你的表名,去试下
with table_name(id,col1,col2,c)as( select 1,null,'S1','C1' from dual union all select 2,'N2',null,'C1' from dual union all select 3,'N3','S3','C2' from dual ) SELECT id, col1, col2, c FROM (SELECT id, MAX(t.col1) over(PARTITION BY t.c) col1, --此处只写了c字段相同分组 楼主多个自行修改 MAX(t.col2) over(PARTITION BY t.c) col2, row_number() over(PARTITION BY t.c ORDER BY t.id DESC) rn, t.c FROM table_name t) WHERE rn = 1;--结果: ID COL1 COL2 C ---------- ---- ---- -- 2 N2 S1 C1 3 N3 S3 C2
有什么更好的 方案么?
合并表吧,表的结构你难道不用先创建插入的列然后再插入?主表都没地方了你还想往哪插?更改主表属性然后再update就好,我感觉怎么还是重建比较好,或者视图也不行?
select
NVL(A.C1,B.C1) C1,
NVL(A.C2,B.C2) C2,
NVL(A.C3,B.C3) C3,
NVL(A.C4,B.C4) C4
……
FROM T A,T B
WHERE A.id >B.id
这个表自关联,分别起别名为A和B
你把语句中的T改为你的表名,去试下
with table_name(id,col1,col2,c)as(
select 1,null,'S1','C1' from dual
union all
select 2,'N2',null,'C1' from dual
union all
select 3,'N3','S3','C2' from dual
)
SELECT id, col1, col2, c
FROM (SELECT id,
MAX(t.col1) over(PARTITION BY t.c) col1, --此处只写了c字段相同分组 楼主多个自行修改
MAX(t.col2) over(PARTITION BY t.c) col2,
row_number() over(PARTITION BY t.c ORDER BY t.id DESC) rn,
t.c
FROM table_name t)
WHERE rn = 1;--结果:
ID COL1 COL2 C
---------- ---- ---- --
2 N2 S1 C1
3 N3 S3 C2
这是oracle区,sqlsevel只能使用case when实现了
但是 学了一招 NVL 给力,,,
仍然感谢!