当前位置: 代码迷 >> Sql Server >> 一条静态SQL语句,请问SQL高手,执行结果诡异
  详细解决方案

一条静态SQL语句,请问SQL高手,执行结果诡异

热度:63   发布时间:2016-04-24 10:03:50.0
一条静态SQL语句,请教SQL高手,执行结果诡异。
这个问题可能有点难度,因为大家没有实际的操作环境去测试。SQL语句如下:
select * from LR where LRId in(
    SELECT LR.LRId
      FROM LR inner join groups on groups.groupid=lr.GroupId where 
     (GroupNo='ZHA140801C' and Amount= 3840)  or 
     (GroupNo='ZHB140804A' and Amount= 5120) or  (GroupNo='ZHS140805A ' and Amount= 6560) or
     (GroupNo='ZHA140808C' and Amount= 5280) or  (GroupNo='ZHA140811C ' and Amount= 3840) or
      (GroupNo='ZHS140813A-1' and Amount= 9600) or  (GroupNo='ZHS140813A' and Amount= 7920) or
      (GroupNo='ZHS140816A' and Amount= 8880)
)

---其中GroupNo为Groups表中字段,唯一,Amout为LR表中字段,表示金额
问题
1、可能大家认为外围的Select是多余的,确实是的,本来是准备写Update的。但现在不管是不是多余,根据语法,我搞不懂为什么会出现以下的结果,结果如下:
2、in内部的Select单独执行时,搜索出9条LRId。
3、整个Select执行时,搜索出39条记录
4、修改表中数据的Amount,导致in内部的Select语句搜索记录为0条或1条....外围的Select仍旧为39条数据

我搞不懂到底问题出在哪儿

------解决方案--------------------
你里面还有一个inner join,在LR中groupid和groups 中没对上。

其实外面的select不等价与里面的select
------解决方案--------------------
你LR表中的 LRId有重复记录吧~
不太相信你的in内部的Select语句搜索记录为0条时,外围的Select仍旧为39条数据~
------解决方案--------------------
LR表中存在2条记录 他的LRID一样,但是AMOUNT字段一个为3840,并且满足GroupNo='ZHA140801C' and Amount= 3840,另外一个不满足。这导致在内部SEL中这个结果返回一行。但是在外部查询的时候返回2行。这是一种原因。
而且也要看你的连接条件是不是1对1的 如果不是也有可能导致。

------解决方案--------------------
请问LR表LRId字段的数据不是唯一的是吧?
"in内部的Select单独执行时,搜索出9条LRId。"  --> 符合子查询where子句诸多条件的LRId有9个.
"整个Select执行时,搜索出39条记录"  --> 当LR表LRId字段的数据不是唯一时,同个LRId可能对应多笔记录,所以2个数量没有可比性.
------解决方案--------------------
引用:
你LR表中的 LRId有重复记录吧~
不太相信你的in内部的Select语句搜索记录为0条时,外围的Select仍旧为39条数据~

同意
------解决方案--------------------
建议在内外查询都加个distinct  外查询也改成只有一个LRID列的 看看2个查询返回结果一样吗。
  相关解决方案