暂无图片
分享
zqf4519
2021-03-24
mysql in sysdate子查询的问题

各位,请教一下,数据库环境,mysql 5.7.18,今遇到1SQL问题,如下:

1、表

image.png
image.png

image.png

2、in +sysdate子查询语句及结果
image.png

结果与预期相差,可以认定结果不正确

3、in子查询,去掉sysdate
image.png

4、in+now子查询
image.png
与预期结果一致,结果正确

5、exists +sysdate查询

image.png
查询结果正确

不考虑SQL的性能,有2和3 ,相比较,疑惑如下:
在in子查询中的sysdate过滤条件相当于失效,在in子查询中,now过滤条件可以正常使用,这个结论是否正确?有没有相关的文档说明这块?

收藏
分享
6条回答
默认
最新
杨明翰

set optimizer_switch=‘semijoin=off’;
关闭semijon优化后再试试in +sysdate子查询语句

暂无图片 评论
暂无图片 有用 1
暂无图片
lastwinner

测试很详尽,很有钻研精神,赞一个。
“在in子查询中的sysdate过滤条件相当于失效”,实际上这就是bug。
在你的测试中,每条SQL的单次执行时间其实都很短,可以认为不会出现sysdate大概率不会在查询结果中出现不同值的现象。所以这应当是bug。

更进一步,建议追加测试:
1、in里使用sysdate的查询,单独执行会有什么效果?
以此确定,到底是查询本身结果就出现了问题,还是加上in才出现的问题。

2、in里的子查询,将distinct关键字去掉,再做测试看看效果。
以此确定问题和distinct是否有关系。

暂无图片 评论
暂无图片 有用 0
zqf4519

非常感谢您的回复,
1、in里使用sysdate的查询,单独执行会有什么效果?
这个当时做过测试,如下:image.png
这个结果当时测试是没有问题的
2、in里的子查询,将distinct关键字去掉,再做测试看看效果。
这个当时测试的与distinct 语句无关

暂无图片 评论
暂无图片 有用 0
zqf4519

杨大师的方法确实可行,关闭这个选项后,确实用sydate()和now(),exists的写法取得结果一致,是想要的结果。追加请教一下,不关闭这个选项的时候,now()为啥可以取得正确的结果?非常感谢!

暂无图片 评论
暂无图片 有用 0
zqf4519

杨大师的方法确实可行,非常感谢!追加请教一下,为啥不关闭这个选项,用now(),同样的写法,也可以得出正确的结果呢?再次感谢!

暂无图片 评论
暂无图片 有用 0
zqf4519
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏