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

hwyqy 2014-08-22 06:27:42
这个问题可能有点难度,因为大家没有实际的操作环境去测试。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条数据

我搞不懂到底问题出在哪儿
...全文
236 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaodongni 2014-08-25
  • 打赏
  • 举报
回复
建议在内外查询都加个distinct 外查询也改成只有一个LRID列的 看看2个查询返回结果一样吗。
xxfvba 2014-08-24
  • 打赏
  • 举报
回复
引用 2 楼 sjcss 的回复:
你LR表中的 LRId有重复记录吧~ 不太相信你的in内部的Select语句搜索记录为0条时,外围的Select仍旧为39条数据~
同意
唐诗三百首 2014-08-24
  • 打赏
  • 举报
回复
引用 6 楼 HtoFire 的回复:
LRId不会重复的,是自动增长列
自增列(identity)是可能重复的喔,如下测试,建议检查确认一下.

-- 建测试表
create table LR(LRId int not null identity(1,1))


-- 插入2条重复LRId的记录
set identity_insert LR on

insert into LR(LRId) select 101

insert into LR(LRId) select 101

set identity_insert LR off
 

-- 检查重复
select LRId,
       count(1) 'qty'
 from LR
 group by LRId
 having count(1)>1

/*
LRId        qty
----------- -----------
101         2

(1 row(s) affected)
*/
hwyqy 2014-08-24
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:
请问LR表LRId字段的数据不是唯一的是吧? "in内部的Select单独执行时,搜索出9条LRId。" --> 符合子查询where子句诸多条件的LRId有9个. "整个Select执行时,搜索出39条记录" --> 当LR表LRId字段的数据不是唯一时,同个LRId可能对应多笔记录,所以2个数量没有可比性.
晕死,刚刚在家又试了,结果符合预期,没有出现39条记录的问题。 SQL语句肯定没问题,从单位电脑复制到CSDN,再从CSDN复制到家里电脑。 为了这个事情,周五我在办公室从5点半弄到6点半没搞定,是不是单位电脑的企业管理器有问题?晕死。。。。
hwyqy 2014-08-24
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:
请问LR表LRId字段的数据不是唯一的是吧? "in内部的Select单独执行时,搜索出9条LRId。" --> 符合子查询where子句诸多条件的LRId有9个. "整个Select执行时,搜索出39条记录" --> 当LR表LRId字段的数据不是唯一时,同个LRId可能对应多笔记录,所以2个数量没有可比性.
LRId不会重复的,是自动增长列
唐诗三百首 2014-08-23
  • 打赏
  • 举报
回复
请问LR表LRId字段的数据不是唯一的是吧? "in内部的Select单独执行时,搜索出9条LRId。" --> 符合子查询where子句诸多条件的LRId有9个. "整个Select执行时,搜索出39条记录" --> 当LR表LRId字段的数据不是唯一时,同个LRId可能对应多笔记录,所以2个数量没有可比性.
xiaodongni 2014-08-22
  • 打赏
  • 举报
回复
LR表中存在2条记录 他的LRID一样,但是AMOUNT字段一个为3840,并且满足GroupNo='ZHA140801C' and Amount= 3840,另外一个不满足。这导致在内部SEL中这个结果返回一行。但是在外部查询的时候返回2行。这是一种原因。 而且也要看你的连接条件是不是1对1的 如果不是也有可能导致。
美到心痛 2014-08-22
  • 打赏
  • 举报
回复
你LR表中的 LRId有重复记录吧~ 不太相信你的in内部的Select语句搜索记录为0条时,外围的Select仍旧为39条数据~
shoppo0505 2014-08-22
  • 打赏
  • 举报
回复
你里面还有一个inner join,在LR中groupid和groups 中没对上。 其实外面的select不等价与里面的select

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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