有表 两TABLE
结构如下:
主表A:A B C H D
aa bb cc hh dd
aa bb dd hh dd 其中A,B,C 是主健
从表B
A B C D E F
aa bb cc 1 ee ff
aa bb cc 2 ee ff
aa bb cc 3 ee ff
其中A,B,C,D都是主健.怎么样写一个SQL语句得知道A表中在B表是有相应的数据.如A表中的 aa bb cc hh dd 这一记录在表B中存在对应有数据.
结构如下:
主表A:A B C H D
aa bb cc hh dd
aa bb dd hh dd 其中A,B,C 是主健
从表B
A B C D E F
aa bb cc 1 ee ff
aa bb cc 2 ee ff
aa bb cc 3 ee ff
其中A,B,C,D都是主健.怎么样写一个SQL语句得知道A表中在B表是有相应的数据.如A表中的 aa bb cc hh dd 这一记录在表B中存在对应有数据.
比如说你要取b表的d为最大或者最小的
select aa.*
from
(
select a.*.b.*,row_number() over (partition by a.a,a.b,a.c order by b.d)/*b.d ASC排序就是取最小的,DESC就是取最大的*/
from a,b
where a.a=b.a
and a.b=b.b
and a.c=b.c)
where aa.rn=1
select aa.*
from
(
select a.*.b.*,
row_number() over (partition by a.a,a.b,a.c order by b.d) rn
/*b.d ASC排序就是取最小的,DESC就是取最大的*/
from a,b
where a.a=b.a
and a.b=b.b
and a.c=b.c) aa
where aa.rn=1这个就是取b.d最小或者最大的那个
A B C H D
aa bb cc hh dd
aa bb dd hh dd 其中A,B,C 是主健
从表B
A B C D E F
aa bb cc 1 ee ff
aa bb cc 2 ee ff
aa bb cc 3 ee ff
aa bb dd 1
只要得到
aa bb cc hh dd aa bb cc 1 ee ff
aa bb dd hh dd aa bb dd 1
就可以了
WITH a AS (
SELECT 'aa' as a,'bb' as b,'cc' as c,'hh' as d,'dd' as h FROM dual union
SELECT 'aa' ,'bb' ,'dd', 'hh' ,'dd' FROM dual
),b AS(
select 'aa' as a,'bb' as b,'cc' as c,'1' as d,'ee' as e,'ff' as f from dual union
SELECT 'aa' ,'bb' ,'cc','2','ee','ff' FROM dual union
SELECT 'aa' ,'bb' ,'cc','3','ee' ,'ff' FROM dual
)
SELECT * FROM a
WHERE (a,b,c) IN (SELECT a,b,c FROM b)
aa bb cc hh dd aa bb cc 1 ee ff
aa bb dd hh dd aa bb dd 1
看样子你的数据不具有普遍性,看不出来你最终要什么样的数据
一般是取最小或者最大,楼主你的例子就是取最小的那条关联上。这样可以得到a,b的字段
如果你只想得到A的字段,可以向我那样写1楼,2楼的方法都是对的,你为什么不测试下再说话了?
就是按a.a,a.b,a.c分组,然后再按b.d排序,最后按这个顺序给每条纪录一个编号
select a.*.b.*,
row_number() over (partition by a.a,a.b,a.c order by b.d) rn
/*b.d ASC排序就是取最小的,DESC就是取最大的*/
from a,b
where a.a=b.a
and a.b=b.b
and a.c=b.c这样出来的结果就是
A.a a.b a.c a.h a.d b.a b.b b.c b.d b.E b.F rn
aa bb cc hh dd aa bb cc 1 ee ff 1
aa bb cc hh dd aa bb cc 2 ee ff 2
aa bb cc hh dd aa bb cc 3 ee ff 3
aa bb dd hh dd aa bb cc 1 1
最后再把rn=1的取出来
aa bb cc hh dd aa bb cc 1 ee ff 1
aa bb dd hh dd aa bb cc 1 1
在这一例子里,其实rn会等于b.d,不过你b.d如果不是1,2,3 顺序,比如说是2,3,4那就不等了
如是按desc排序,结果就是
A.a a.b a.c a.h a.d b.a b.b b.c b.d b.E b.F rn
aa bb cc hh dd aa bb cc 1 ee ff 3
aa bb cc hh dd aa bb cc 2 ee ff 2
aa bb cc hh dd aa bb cc 3 ee ff 1
aa bb dd hh dd aa bb cc 1 1
再取rn=1aa bb cc hh dd aa bb cc 3 ee ff 1
aa bb dd hh dd aa bb cc 1 1
row_number() over (partition by a.a,a.b,a.c order by b.d) rn
/*b.d ASC排序就是取最小的,DESC就是取最大的*/
from a,b
where a.a=b.a
and a.b=b.b
and a.c=b.c 其实这句写得偷懒了,完成按你的要求的话select aa.a,aa.b,aa.c,aa.d,aa.e,aa.f
from
(
select a.*.b.d,b.e,b.f,
row_number() over (partition by a.a,a.b,a.c order by b.d) rn
/*b.d ASC排序就是取最小的,DESC就是取最大的*/
from a,b
where a.a=b.a
and a.b=b.b
and a.c=b.c) aa
where aa.rn=1其实如果你的b.d固定都是从1开始的话,也不用设rn了,直接b.d=1就行了
WHERE exists (SELECT 1 FROM b wher a.a=b.a and a.b =b.b and a.c=b.c)呵呵