首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

百思不得其解的sql, 请大伙帮忙看下

2013-06-25 
百思不得其解的sql, 请大家帮忙看下本人最近在做开发的时候,写了如下一段SQL这是加上OR但是如果在SQL后面

百思不得其解的sql, 请大家帮忙看下
本人最近在做开发的时候,写了如下一段SQL


这是加上OR百思不得其解的sql, 请大伙帮忙看下
但是如果在SQL后面多加一个条件比如说 AND 1=1或者别的, 就能出数据
多加条件后百思不得其解的sql, 请大伙帮忙看下
实在不能理解,请帮忙解答下谢谢了, DB环境是Oracle 10g, tools: PLSQL

PS, 我在OR 条件上加上trim也能出结果.
OR TRIM(A.SF_BILL_STATUS) = 'I'
 请问这是为什么呢? 
(当然用Union也可以解决, 只是想找到为什么会这样. )
[解决办法]
看起来 像  个 10g的bug。。。放到11g里面运行怎么样呢???
[解决办法]
楼主如果知道怎么回事,不妨通知大家一下,我们也想知道为什么。
[解决办法]
请楼主仔细看你的SQL结果,去掉OR的SF_BILL_STATUS='C',你加上OR之后
OR A.SF_BILL_STATUS = 'I
还是查SF_BILL_STATUS,但是这个字段的值是C,所以你查询不到结果。你加上其他的条件查询的又是另外一个字段了,所以能查询出结果。
[解决办法]
你同一个字段用AND,又OR,为什么不用直接用括号括起来OR呢?
你可以这样试试:
SELECT A.SF_BILL_STATUS  FROM SYSADM.PS_SM_TAX_INV_REG1 A 
WHERE A.INVOICE_DT BETWEEN TO_DATE('2013-01-10', 'YYYY-MM-DD') 
AND TO_DATE('2013-01-12', 'YYYY-MM-DD')
AND ((A.SF_BILL_STATUS = 'C' OR A.SF_BILL_STATUS = 'I') AND A.CANCEL_DT > TO_DATE('2013-01-26', 'YYYY-MM-DD'))
不知道是不是符合您的需求,但是这种才是最直接明了的SQL.
[解决办法]
#5,同感,查询成功执行了,但没有查询结果。
[解决办法]
把加上了OR  A.SF_BILL_STATUS = 'I' 和没有加 OR A.SF_BILL_STATUS = 'I' 这两个sql的执行计划都拿出来先看看。我觉得应该从执行计划上面着手
[解决办法]
引用:
你同一个字段用AND,又OR,为什么不用直接用括号括起来OR呢?
你可以这样试试:
SELECT A.SF_BILL_STATUS  FROM SYSADM.PS_SM_TAX_INV_REG1 A 
WHERE A.INVOICE_DT BETWEEN TO_DATE('2013-01-10', 'YYYY-MM-DD') 
AND TO_DATE('2013-01-12', 'YYYY-MM-DD')
AND ((A.SF_BILL_STATUS = 'C' OR A.SF_BILL_STATUS = 'I') AND A.CANCEL_DT > TO_DATE('2013-01-26', 'YYYY-MM-DD'))
不知道是不是符合您的需求,但是这种才是最直接明了的SQL.


楼主的SQL那个逻辑是SF_BILL_STATUS = 'C'的时候CANCEL_DT 要大于2013-01-26,而SF_BILL_STATUS = 'I'的时候,不管时间,你这一改,整个逻辑都不对了
[解决办法]
了解sql的执行顺序这个问题就明白了。
[解决办法]
我始终认为和执行计划有关
执行顺序问题真心不见得
楼主  把两个的执行计划贴出来看看
[解决办法]
你把后面的条件放前面去执行一下,这个真的很诡异啊。
[解决办法]
楼主首先看看表中的数据,尤其是SF_BILL_STATUS为C和I时的INVOICE_DT,因为最终是要都有INVOICE_DT进行限制的。我估计是SF_BILL_STATUS为I时的INVOICE_DT不满足条件所致。
至于增加后又可以查到数据了,你得看看执行计划。我推测是改变了优先级,or的部分就没有执行。
[解决办法]
这个应该是or和and的问题,建议楼主提供下表结构及初始化数据,然后让大家写下sql实际了解下
[解决办法]
SQL没发现问题,执行计划不可能改变sql的执行结果,不然这个bug提交给oracle估计也发财了
and或or的连接也没问题,还是请楼主把建表和数据的语句发出来,让大家仔细检查下
[解决办法]
直接用这个TRIM(A.SF_BILL_STATUS) = 'I'条件查询出SF_BILL_STATUS 的数据,
绝对是你的SF_BILL_STATUS的数据有问题。
仔细查找看看。
[解决办法]
筛选条件的逻辑问题吧
[解决办法]
没看出sql有任何的问题,疼了。。。

热点排行