一个SQL查询的问题 请教下各位大佬

u010740843 2017-08-07 10:25:28
有两条SQL语句

 select COUNT(*) from [tab_limited] where id in (select min(id) from [tab_limited] group by text) 


 select count(distinct(text)) from [tab_limited] 


查询的结果是一样的

但是在加了个时间判断的条件以后
 select COUNT(*) from [tab_limited] where id in (select min(id) from [tab_limited] group by text)  and  createtime_string=20170806


 select count(distinct(text)) from [tab_limited]    where createtime_string=20170806


结果却不一样了

是什么原因呢? 学SQL没多久 请教下各位大佬 谢谢
...全文
142 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RICHEER COCA 2017-09-04
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
写了个三条数据的例子:
--测试数据
if not object_id(N'Tempdb..#tab_limited') is null
drop table #tab_limited
Go
Create table #tab_limited([id] int,[text] nvarchar(23),[createtime_string] INT)
Insert #tab_limited
select 1,N'测试1',20170807 union all
select 2,N'测试1',20170806 union all
select 4,N'测试2',20170806
Go
--测试数据结束
--1、
SELECT COUNT(*)
FROM [#tab_limited]
WHERE id IN ( SELECT MIN(id)
FROM [#tab_limited]
GROUP BY text ) --这里搜索出来的id是1、4 但显然1是不符合where条件的,但是2符合条件
AND createtime_string = 20170806
--2、
SELECT COUNT(DISTINCT ( text )) --这里搜索出来的id是2、4
FROM [#tab_limited]
WHERE createtime_string = 20170806


唐诗三百首 2017-08-07
  • 打赏
  • 举报
回复
2个SQL的逻辑不一样, 结果也不一样. 第2个SQL统计结果中, 有些text值的id不是最小的.
  • 打赏
  • 举报
回复
执行顺序的问题, 1 先去重 2 先判断时间
顺势而为1 2017-08-07
  • 打赏
  • 举报
回复
不一样, 第一条语句除以Text分组外还以 ID作为限制条件查询 select COUNT(*) from [tab_limited] where id in (select min(id) from [tab_limited] group by text) 第二条语句与ID无关, 只以Text分组 select count(distinct(text)) from [tab_limited] 两条语句都加 createtime_string=20170806 条件后, 第一条因为ID的原因, 在 select min(id) from [tab_limited] group by text 分组后将一些本属于时间的 20170806 的记录剔除了, 所以第一条查出的记录会更少. 第二条则只受时间条件影响.
见习水师 2017-08-07
  • 打赏
  • 举报
回复
select min(id) from [tab_limited] group by text 取text相同记录的最小ID。这里把部分createtime_string=20170806 的数据过滤掉了
二月十六 版主 2017-08-07
  • 打赏
  • 举报
回复
写了个三条数据的例子:
--测试数据
if not object_id(N'Tempdb..#tab_limited') is null
drop table #tab_limited
Go
Create table #tab_limited([id] int,[text] nvarchar(23),[createtime_string] INT)
Insert #tab_limited
select 1,N'测试1',20170807 union all
select 2,N'测试1',20170806 union all
select 4,N'测试2',20170806
Go
--测试数据结束
--1、
SELECT COUNT(*)
FROM [#tab_limited]
WHERE id IN ( SELECT MIN(id)
FROM [#tab_limited]
GROUP BY text ) --这里搜索出来的id是1、4 但显然1是不符合where条件的,但是2符合条件
AND createtime_string = 20170806
--2、
SELECT COUNT(DISTINCT ( text )) --这里搜索出来的id是2、4
FROM [#tab_limited]
WHERE createtime_string = 20170806


OwenZeng_DBA 2017-08-07
  • 打赏
  • 举报
回复
引用 楼主 u010740843 的回复:
有两条SQL语句
 select COUNT(*) from [tab_limited] where id in (select min(id) from [tab_limited] group by text) 
 select count(distinct(text)) from [tab_limited] 
查询的结果是一样的 但是在加了个时间判断的条件以后
 select COUNT(*) from [tab_limited] where id in (select min(id) from [tab_limited] group by text)  and  createtime_string=20170806
 select count(distinct(text)) from [tab_limited]    where createtime_string=20170806
结果却不一样了 是什么原因呢? 学SQL没多久 请教下各位大佬 谢谢
上面SQL 表示,先去重 然后 时间等于20170806 下面这个是,时间等于20170806的数据再去重,所以不一样

34,576

社区成员

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

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