有点意思的sql
同事问我一个问题,要我写几条sql。假设表temp的结构是这样的:
字段: id, name
有这些记录:
123, foo
123, bar
123, test
124, test
125 foo
126 bar
127 foo
127 test
128 foo
128 bar
128 test
128 else
现在要写4条sql,找到符合下面四个条件的id:
1. 只有name = foo
2. 只有name = bar
3. name = foo以及name = bar
4. name != foo以及name != bar
第1条开始写出了这样的sql:
SELECT Id FROM temp WHERE Id IN (SELECT Id FROM temp GROUP BY Id HAVING COUNT(*) = 1) AND Name = 'foo'
显然不对,比如127这个Id就漏了。不过,同事的要求是不需要找出全部记录,随便找出几个就行了,所以这个还能满足要求。
第3条想了一会,写出来了
SELECT T1.Id FROM ( SELECT Id FROM temp WHERE Name = 'foo' GROUP BY Id ) as T1 INNER JOIN ( SELECT Id FROM temp WHERE Name = 'bar' GROUP BY Id ) as T2 ON T1.Id = T2.Id
第4条想不出,查了资料,写法很巧妙
SELECT Id FROM ( SELECT Id, MAX(CASE WHEN Name IN ('foo', 'bar') THEN 1 ELSE 0 END) AS flag FROM temp GROUP BY Id ) as T WHERE T.flag = 0
回过头来,第1条可以这样写
SELECT Id FROM ( SELECT Id, MAX(CASE WHEN Name = 'foo' THEN 1 ELSE 0 END) AS flag FROM temp GROUP BY Id ) as T WHERE T.flag = 1
第2条就很容易了,把foo 换成bar就好了。这个sql还是有点难度的,有点意思,学习一下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律