空值合并的问题请教大家

[复制链接]
查看11 | 回复7 | 2011-2-18 11:43:34 | 显示全部楼层 |阅读模式
有两个表 a b
a id没有重复的
b id(重复)姓名性别
1
1
张三null
2
1
null男

如何将两表合并为
1 张三 男 呢?
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
这是行列转换问题,可以搜索下。
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
select b.id,max(b.name),max(n.sex)
from t
group by b.id
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
select b.id,max(b.姓名),max(b.性别)
from b,a
where a.id=b.id
group by b.id
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
顺带问一下空值在进行比较的时候的问题
with temp as (
select 1 a,2 b ,null c from dual
union all
select 2 a,null b ,1 c from dual
)
select * from temp

A
B
C
1
1
2
null
2
2
null
1

with temp as (
select 1 a,2 b ,null c from dual
union all
select 2 a,null b ,1 c from dual
)
select max(a),max(b),max(c),min(a),min(b),min(c) from temp

MAX(A)
MAX(B)
MAX(C)
MIN(A)
MIN(B)
MIN(C)
1
2
2
1
1
2
1
with temp as (
select 1 a,2 b ,null c from dual
union all
select 2 a,null b ,1 c from dual
)
select greatest(a,b,c),least(a,b,c)from temp

GREATEST(A,B,C)
LEAST(A,B,C)
1
null
null
2
null
null
在用max或min对一列进行比较时,无论取最大还是最小,都不会选择空值,而用greatest或least对一行进行比较时,不论最大还是最小都取的空值?
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
其实我也有LZ类似的问题,也就是LZ问题的拓展型
B 表多个DATE 字段是日期型,我们这里就不要MAX(姓名)这样的,按这日期最大,取一个第一个非空值的话,得如何写SQL?
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
原帖由 wkc168 于 2010-12-18 09:21 发表
select b.id,max(b.姓名),max(b.性别)
from b,a
where a.id=b.id
group by b.id

你这样的表链接方式叫ANSI 6.0还是叫啥来着。相比通常的LEFT JOIN 他没有局限性么?
select * from employees t
left join jobs jon t.job_id=j.job_id and t.salary>6000
如上的链接方式,按你那种方式得如何实现呢?
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
select * from employees t
left join jobs jon t.job_id=j.job_id and t.salary>6000
这是SQL92写法,另外的老的是SQL86
改写
select * from employees t, jobs j
where t.job_id=(case when t.salary>6000then
j.job_id(+) end);
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行