有两张表,表A(组合代码表) 字段:组合代码,代码
表B(明细内容表) 字段:代号,代码表A 内容:
test1 001
test1 002
test2 003
test2 004表B内容:9999 001
9999 002
8888 001
8888 002
7777 003
7777 004
6666 001
5555 001两个表用代码关联。
我要取出表B的9999,8888,7777,不要取6666和5555,应该怎么写法
就是说,我要取出所有符合表A的组合的表B的内容
如果不能实现,是不是表A需要修改

解决方案 »

  1.   

    procedure or function? you can choose one :-)
      

  2.   

    select l.* from B l,(select B.id from B b having count(*) > 1 group by b.id) r
    where l.id = b.id
      

  3.   

    给你个简单的思路:select 代码1 from
    (select 代码1,代码2,row_number() over(partition by 代码1 order by 代码2) rn from B)
    where rn = 2;
      

  4.   

    SQL> select * from b;
     
                                         B1 B2
    --------------------------------------- --------------------
                                       9999 001
                                       9999 002
                                       8888 001
                                       8888 002
                                       7777 003
                                       7777 004
                                       6666 001
                                       5555 001
     
    8 rows selected
     
    Executed in 0.109 seconds
     
    SQL> 
    SQL> select b1 from
      2  (select b1,b2,row_number() over(partition by b1 order by b2) rn from B)
      3  where rn = 2;
     
                                         B1
    ---------------------------------------
                                       7777
                                       8888
                                       9999
     
    Executed in 0.063 seconds
     
    SQL> 
      

  5.   

    select 代号 from(
    select b.代号,count(distinct b.代码)ct,a.组合代码 from b 
    left join a on b.代码=a.代码
    group by b.代号,a.组合代码)t
    where ct=(select count(1) from a where a.组合代码=t.组合代码)
      

  6.   

    非常感谢,就是还有可能的组合不一定是2个的,可能是3,4个代码组成的,另外麻烦的还有组合代码对应代码还有重复的,就是说test1 对应 001 test2可能也会对应 001
      

  7.   


    ... B.代码 in ('9999','8888','7777');
    不就行了
      

  8.   

    ....
    另外麻烦的还有组合代码对应代码还有重复的,就是说test1 对应 001 test2可能也会对应 001
    .....如果有这种情况,你现在的结构是无法做到的,因为:
    9999 001 
    9999 002 
    可能对应的是不同的2个组合代码。
      

  9.   


    可以做到
    如果一个代号符合两个组合代码
    那么结果会返回两次。为了更直观点
    加一个字段
    可以测试下
     select 代号,组合代码 from(
    select b.代号,count(distinct b.代码)ct,a.组合代码 from b 
    left join a on b.代码=a.代码
    group by b.代号,a.组合代码)t
    where ct=(select count(1) from a where a.组合代码=t.组合代码)
      

  10.   

    如果b表不会有重复记录
    第一行代码的distinct可以去掉
      

  11.   

    逻辑上理一下,表B的代码关联到表A的代码,是为外键关联的关系。
    所以在表A的代码作为被关联的外键,应该具有唯一性。给你改一下:
    表A:
    表A 内容: 
    test1 001 1
    test1 002 2
    test2 003 3
    test2 004 4
    test3 001 5
    test3 003 6表B内容: 9999 001 1
    9999 002 2
    8888 001 1
    8888 002 2
    7777 003 3
    7777 004 4
    6666 001 1
    5555 001 5利用表A新加的第三列和表B新加的第三列进行关联。希望对你有帮助。