这个问题可能有点难度,因为大家没有实际的操作环境去测试。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个数量没有可比性.
------解决方案--------------------
同意
------解决方案--------------------
建议在内外查询都加个distinct 外查询也改成只有一个LRID列的 看看2个查询返回结果一样吗。