A/B表替1对多关系,要求联合查询B表只提取一条与A记录关联的记录

A表 aid name
  1 KLK
  2 KSS
  3 LKI
  ……
  N ADD
B表 bid name_id ports
  1 1 9089
  2 1 8089
  3 1 7089
  4 2 6077
  5 2 7077
  6 3 8900
  ……
查询结果要求为:
  aid bid ports
  1 1 9089
  2 4 6077
  3 6 8900

 

查询语句设计

select * from a ,(select * from  b  b1

where not  exists  (select  1 from b  b2 where b1.name_id=b2.name_id and b1.id >b2.id))

where a.id=b.name_id

 

个人对上述查询的理解

 把 not  exists  换成 not  in  来理解下

select * from  b  b1

where not  in(select  1 from b  b2 where b1.name_id=b2.name_id and b1.id >b2.id))

再把not  in 换成in 来考虑下

select  * from b  b2 where b1.name_id=b2.name_id and b1.id >b2.id

再把上述语句转换成内连接查询来考虑下

select b1.id,b1.name_id,b2.id from b b1, b b2

where b1.name_id=b2.name_id

b1.idb1.name_idb2.id
111
112
113
211
212
213
311
312
313
424
425
524
525
636

 上表就是我们连接查询得到的结果,通过筛选条件 b1.id>b2.id得到的结果即为红色标记部分的结果

现在考虑

not  in 的作用了,这里我们就当成整条记录  作为not  in 的主语

理解 select  * from  b b1 where  not   in (红色标记部分组合成的结果)可以简单理解为,从表b的  6条记录中取出 不是红色标记的部分,

即从表B中去掉(id=2 and  name_id=1)( id=3 and name_id=1)( id=5 and name_id=2) 这3条记录。

感觉我把这玩意弄复杂了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值