SQL案例:反向思维(发生额案例)
来源:互联网 发布:生意专家软件好用吗 编辑:程序博客网 时间:2024/04/28 14:38
-- 建表CREATE TABLE TestDB( id INT PRIMARY KEY AUTO_INCREMENT, AccID VARCHAR(20), Occmonth DATE, DebitOccur BIGINT);-- 添加数据INSERT INTO TestDB VALUES(NULL,'101','1988-1-1',100),(NULL,'101','1988-2-1',110),(NULL,'101','1988-3-1',120),(NULL,'101','1988-4-1',100),(NULL,'101','1988-5-1',100),(NULL,'101','1988-6-1',100),(NULL,'101','1988-7-1',100),(NULL,'101','1988-8-1',100);INSERT INTO TestDB VALUES(NULL,'102','1988-1-1',90),(NULL,'102','1988-2-1',110),(NULL,'102','1988-3-1',120),(NULL,'102','1988-4-1',100),(NULL,'102','1988-5-1',100),(NULL,'102','1988-6-1',100),(NULL,'102','1988-7-1',100),(NULL,'102','1988-8-1',100);INSERT INTO TestDB VALUES(NULL,'103','1988-1-1',150),(NULL,'103','1988-2-1',160),(NULL,'103','1988-3-1',180),(NULL,'103','1988-4-1',120),(NULL,'103','1988-5-1',120),(NULL,'103','1988-6-1',120),(NULL,'103','1988-7-1',120),(NULL,'103','1988-8-1',120);INSERT INTO TestDB VALUES(NULL,'104','1988-1-1',130),(NULL,'104','1988-2-1',130),(NULL,'104','1988-3-1',140),(NULL,'104','1988-4-1',150),(NULL,'104','1988-5-1',160),(NULL,'104','1988-6-1',170),(NULL,'104','1988-7-1',180),(NULL,'104','1988-8-1',140);INSERT INTO TestDB VALUES(NULL,'105','1988-1-1',100),(NULL,'105','1988-2-1',80),(NULL,'105','1988-3-1',120),(NULL,'105','1988-4-1',100),(NULL,'105','1988-5-1',100),(NULL,'105','1988-6-1',100),(NULL,'105','1988-7-1',100),(NULL,'105','1988-8-1',100);-- 从 TestDB 数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目-- 难点:所有月份,即存在月份比101存在月份-- 错误答案(没有考虑所有月份)SELECT a.AccID,a.DebitOccur , b.AccID, b.DebitOccurFROM testdb a ,testdb bWHERE a.Occmonth = b.Occmonth AND a.DebitOccur <= b.DebitOccur AND b.AccID = 101-- 思路:第一步:找出有比101科目月份发生额少的月份-- 第二步:排除这些月份SELECT DISTINCT d.AccIDFROM TestDB dWHERE d.AccID NOT IN ( SELECT a.AccID FROM testdb a ,testdb b WHERE a.Occmonth = b.Occmonth AND a.DebitOccur <= b.DebitOccur AND b.AccID = 101)SELECT DISTINCT AccID FROM TestDBWHERE AccID NOT IN (SELECT TestDB.AccID FROM TestDB, (SELECT * FROM TestDB WHERE AccID='101') AS db101 WHERE TestDB.Occmonth=db101.Occmonth AND TestDB.DebitOccur<=db101.DebitOccur);
总结:
从正面进行判断:是否存在某月比101科目少产生发生额的科目,这样进行查找会比较麻烦,而且很难获取到准确的数据,因为科目的月份是不一定的,因此我们要进行反向思考
反向进行判断:只要存在某一个月比101科目少产生发生额的科目,就进行排除,得出一个结果集,使用not in 关键字即可
0 0
- SQL案例:反向思维(发生额案例)
- 全选案例思维理解
- SQL案例
- SQL案例
- SQL优化案例(2)
- SQL优化案例(3)
- 互联网思维身边的案例
- JS 之 (五)正向反向预查、正则案例、贪吃蛇案例
- 案例
- 案例
- 案例
- 案例
- 案例
- 案例
- 案例
- 案例
- oracle PL-SQL学习案例(一)
- oracle PL-SQL学习案例(二)
- androidstudio使用中的问题(实时更新)
- 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践
- Qt QtableView小结
- JavaScript prototype 使用介绍
- 主动模式下FTP的详细工作过程
- SQL案例:反向思维(发生额案例)
- EditText 属性盘点
- Python - abs vs fabs
- iOS网络篇—发送json数据给服务器以及多值参数
- Tomcat dbcp 数据库连接池 的配置及使用
- iOS之汉字转拼音
- C/C++代码调试:快速定位内存的申请和释放的位置
- Awesome Deep Vision
- shell 不同颜色打印