有表 两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中存在对应有数据.

解决方案 »

  1.   

    要看你这条纪录是怎么取了
    比如说你要取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
      

  2.   


    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最小或者最大的那个
      

  3.   

    不是要取最大最小.我们只知道 A和B两个字段,C字段可能存在多个,要取得不同C的记录数.而D肯定会存在一条或多条.所以现在全取出来的话不能根据条数来判断C的记录数.怎么样不用管D这个主健.而取出来的记录数正好是C的记录数如
    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 
    就可以了
      

  4.   

    只判断a的记录是否在B中
    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)
      

  5.   

    照我上面的语句不就能取出以下的结果
    aa bb cc  hh dd  aa bb cc 1  ee  ff  
    aa bb dd hh dd   aa bb dd 1  
    看样子你的数据不具有普遍性,看不出来你最终要什么样的数据
      

  6.   

    楼主,看完我写的话你的A一条对应B的多条,如何确定关联?
    一般是取最小或者最大,楼主你的例子就是取最小的那条关联上。这样可以得到a,b的字段
    如果你只想得到A的字段,可以向我那样写1楼,2楼的方法都是对的,你为什么不测试下再说话了?
      

  7.   

    小弟菜鸟.partition 不太懂是什么意思.所以才发问的.给解释好吗?
      

  8.   

    row_number() (partition by  order by )partition by 相当于group byrow_number() over (partition by a.a,a.b,a.c order by b.d)
    就是按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
      

  9.   

     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 其实这句写得偷懒了,完成按你的要求的话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就行了
      

  10.   

    SELECT a.* FROM a 
    WHERE exists  (SELECT 1 FROM b wher a.a=b.a and a.b =b.b and a.c=b.c)呵呵