表1
户号 姓名 关系 身份号码
1 张三 户主 111111111
1 李四 子 222222222
2 王五 子 333333333
2 刘六 女 444444444
........
户号相同则属于同一户人,按规定,同一户中必须有一个户主,现在想把表中同一户一个户主都没有的户的其中一个成员的身份号码查出来,这样的语句该怎么写啊,望高手指点。
户号 姓名 关系 身份号码
1 张三 户主 111111111
1 李四 子 222222222
2 王五 子 333333333
2 刘六 女 444444444
........
户号相同则属于同一户人,按规定,同一户中必须有一个户主,现在想把表中同一户一个户主都没有的户的其中一个成员的身份号码查出来,这样的语句该怎么写啊,望高手指点。
2 from (select 户号,
3 身份号码,
4 row_number() over(partition by 户号 order by rowid) rn
5 from t
6 where 户号 not in (select distinct 户号 from t where 关系 = '户主'))
7 where rn = 1;
身份号码
----------
333333333
1。先算出有户主的户号
2。用所有户号和第1部算出的集合求差集,得到没有户主的户号
3。用第2部算出的户号集合和表1连接就可以得到身份号码了。sql语句如下:
1.算出有户主的户号
select distinct 户号 from 表1 where 关系='户主'2。通过求差集,算出没有户主的户号
(select distinct 户号 from 表1) minue (select distinct 户号 from 表1 where 关系='户主')3.用第2部的结果连接表1
select max(身份号码),宿主1.户号 from
((select distinct 户号 from 表1) minue (select distinct 户号 from 表1 where 关系='户主')) 宿主1,表1
where 宿主1.户号=表1.户号 group by 宿主1.户号
下面的写法与上面的做法等价:
with
有户主的户 as (select distinct 户号 from 表1 where 关系='户主'),
所有户 as (select distinct 户号 from 表1),
没有户主的户 as (所有户 minue 有户主的户)
select max(身份号码),没有户主的户.户号 from 没有户主的户,表1 where 没有户主的户.户号=表1.户号 group by 没有户主的户.户号
select x.idnum
from(
select t.num,t.name,t.releate as re,t.idnum
from t2 t
group by num,t.idnum,t.name,t.releate
) x
where re is null
1 1 张三 户主 111111111 AAAHeFAALAAABX0AAA
2 1 李四 子 222222 AAAHeFAALAAABX0AAB
3 2 a 户主 3333 AAAHeFAALAAABX0AAC
4 2 刘六 女 44444 AAAHeFAALAAABX0AAD
5 3 b 7777 AAAHeFAALAAABX0AAE
6 4 c 8888 AAAHeFAALAAABX0AAF
select max(身份证号) from table
group by 户号
having sum(decode(关系,'户主',1,0))=0