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
练习