怎么检测出sql中的笛卡尔连接?

kingstarer 2015-06-05 04:40:59
想开发一个功能,可以检测sql中是否含有笛卡连接(即在from出现的表,但在where条件中不与其它表关连)

不知道有啥好办法(考虑过利用explain plan分析sql后到plan_table里面分析数据,但对于sql里面有dblink的情况下就不适用了)
...全文
418 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
binsweet 2015-08-21
  • 打赏
  • 举报
回复
自动检测? 每个sql写完,至少你要验证一下结果吧,这最直观了
xu176032 2015-08-19
  • 打赏
  • 举报
回复
1、检查各种join,left join,right join,full join等等。。 2、把每个sql里面from 后面的截取一下,看看有没有别名,规则就是从from到第几个空格,大概这样 3、如果存在别名,拿这个别名去sql里面遍历一下,看看有没有在等号左右边都存在的。。当然前提是外联的时候都用了别名。 其实跟你那个差不多。。随便写的,参考一下吧
mayanzs 2015-08-19
  • 打赏
  • 举报
回复
要去除自然连接的情况,否则会错报。
qq_30691381 2015-08-18
  • 打赏
  • 举报
回复
加我qq52029056
kingstarer 2015-06-08
  • 打赏
  • 举报
回复
想了一个算法 不知道有没有漏洞 大家帮看看 1 取出语句所有关联的表及别名 2 将where条件转换成大写 3 按'AND' 'OR'拆分where条件成多个语句段(需要考虑字段名包含and或者or字样) 4 遍历拆分结果,对于每个语句段用'='将语句段拆分成左右两部分 5 查找左右两边出现的别名(xx.),如果两边均出现别名(例如左边出现a.,右边出现b.),则标记别名对应的库表已关连(需要注意别名中类似:b. bb. cbb.这样的情况) 6 找出未关连的库表,如有则返回警告 ========================== 这里前提是where条件里面字段都会加上别名限制

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧