面试题——sql怎么避免笛卡尔积问题

问题:
给定一个students表格,字段包括【身份证号(主键),姓名,性别】
现在需要查询出男女姓名一样的名字,最后名字不得有重复,怎么进行查询?
当时我其实没想太多,分别distinct查询性别为男的子表和性别为女的子表,然后进行inner join再取一次distinct。
但是面试官说还有没有更好的优化方法,本菜鸡一时没想起来,面试后和朋友一起讨论,发现还有一个更优的,并分别验证了一下运行时间,具体如下:

第一种:inner joinSELECT name FROM
((SELECT DISTINCT name FROM students where sex = "女") as female
INNER JOIN
(SELECT DISTINCT name FROM students where sex = "男") as male
ON female.name = male.name)


第二种:union allSELECT name FROM
((SELECT DISTINCT name FROM students where sex = "女") UNION ALL
(SELECT DISTINCT name FROM students where sex = "男")) as Z
GROUP BY Z.name
HAVING COUNT(Z.name) >= 2

需要补充一点,union是去重的,但是union all不去重,直接拼接
运行时间对比:
在这里插入图片描述
分享一下个人理解,如果有更好的方法,欢迎一起讨论~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值