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


练习



本文探讨了SQL中使用DISTINCT关键字去除重复记录的方法,分析了连接查询可能导致的一对多情况,以及如何通过CASE WHEN语句解决非等值连接问题。通过具体示例,深入理解SQL查询的细节。
2879





