SQL需注意的问题--自连接篇

2019、05、10更新 需要重点看一下那个distinct的,其他的也要看 

2019/07/24更新 注意p1.name>p2.name一般只在排列组合的时候使用,见例子误区

 

让我们看一下不加distinct的效果

SELECT p1.name,p1.price
  FROM pro p1,pro p2
 WHERE p1.price = p2.price
   AND p1.name <> p2.name;

按行去分析

确实是有重复的,比如p1里面第二行橘子的price=100,和p2的price和name对比,

p2有2个满足p1第二行的条件的,所以橘子和这两个连接,从而橘子出现了2次!!(一定要注重分析连接之后的方式会不会有一对多的情况!!)

思维bug2:使用p1.name>p2.name

问题:有的数据库不支持非等值连接怎么办?--用case when

select distinct
	case when a.goods_name <> b.goods_name then a.goods_name else null end
    ,case when a.goods_name <> b.goods_name then a.price else null end
from 
	products a
join
	products b
on a.price = b.price;

为了去除null,可以再嵌套一层

select t.*
from
(
select distinct
	case when a.goods_name <> b.goods_name then a.goods_name else null end as goods_name
    ,case when a.goods_name <> b.goods_name then a.price else null end as price
from 
	products a
join
	products b
on a.price = b.price
) t
where t.price is not null

 

 

 

练习

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值