有两张表,表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需要修改
表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需要修改
where l.id = b.id
(select 代码1,代码2,row_number() over(partition by 代码1 order by 代码2) rn from B)
where rn = 2;
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>
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.组合代码)
... B.代码 in ('9999','8888','7777');
不就行了
另外麻烦的还有组合代码对应代码还有重复的,就是说test1 对应 001 test2可能也会对应 001
.....如果有这种情况,你现在的结构是无法做到的,因为:
9999 001
9999 002
可能对应的是不同的2个组合代码。
可以做到
如果一个代号符合两个组合代码
那么结果会返回两次。为了更直观点
加一个字段
可以测试下
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.组合代码)
第一行代码的distinct可以去掉
所以在表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新加的第三列进行关联。希望对你有帮助。