求更简单的SQL语句

艾德 2007-11-11 10:55:17
我有一个以下的表:

用户名 访问日期
============
aaa 2007-01-01
bbb 2007-06-10
aaa 2007-05-23
aaa 2007-06-23

我要查出在5月和6月都有访问日期的用户,
我的SQL语句是:
select 用户名 from 表1 where 5月1号<访问日期<5月31号 and 用户名 in ( select 用户名 from 表1 where 6月1号<访问日期<6月31号)

但这样的运算量太大,求一个更简单的SQL语句。谢谢!
...全文
271 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
rgmjeeqg 2007-11-27
  • 打赏
  • 举报
回复
同意8楼的
bjt_ 2007-11-27
  • 打赏
  • 举报
回复
这种运算应该是用group by 快,能确保是一遍表扫描,

select 用户名
from 表1
where 访问日期 > = To_Date( '20070501 ', 'yyyymmdd ') and 访问日期 < To_Date( '20070701 ', 'yyyymmdd ')
group by 用户名
having count(*)>1

又:日期上一定要有索引。

tjinjie 2007-11-27
  • 打赏
  • 举报
回复
试一下这样:
SELECT 用户名,访问日期
FROM T
WHERE TO_CHAR(访问日期,'MM')='05'
GROUP BY 用户名,访问日期
INTERSECT
SELECT 用户名,访问日期
FROM T
WHERE TO_CHAR(访问日期,'MM')='06'
GROUP BY 用户名,访问日期

查询5,6月份有访问的人,然后对这两个结果集进行交集的操作,这样不知道是否符合楼主的需求。
luhaiboy 2007-11-26
  • 打赏
  • 举报
回复
学习...刚刚看了下...我感觉8楼的做法应该快点
hongjinqu 2007-11-25
  • 打赏
  • 举报
回复
Select a.用户名,a.访问日期,b.访问日期 From
(Select distinct 用户名,访问日期 From 表1 Where Substr(访问日期,6,2)='05') a
inner join
(Select distinct 用户名,访问日期 From 表1 Where Substr(访问日期,6,2)='06') b
on a.用户名=b.用户名

这个效率会高一点!
hongjinqu 2007-11-24
  • 打赏
  • 举报
回复
Select a.用户名,a.访问日期,b.访问日期 From
(Select 用户名,访问日期 From 表1 Where Substr(访问日期,6,2)='05') a
inner join
(Select 用户名,访问日期 From 表1 Where Substr(访问日期,6,2)='06') b
on a.用户名=b.用户名
jorn205 2007-11-24
  • 打赏
  • 举报
回复
8楼的 逻辑不对啊,有可能5月份访问两次以上而6月没有

迷失的空间 2007-11-24
  • 打赏
  • 举报
回复
使用oracle的日期函数吧.
把月分出来,再查是不是会快一些?
凤影 2007-11-23
  • 打赏
  • 举报
回复
唉,朽木不可雕也。
liusong_china 2007-11-23
  • 打赏
  • 举报
回复
学习
zhangjian_2015 2007-11-23
  • 打赏
  • 举报
回复
select * from tablename where <访问日期<
union
select * from tablename where <访问日期<
無名VF 2007-11-22
  • 打赏
  • 举报
回复
select * from tablename where extract(month from 访问日期) in (5,6)
無名VF 2007-11-22
  • 打赏
  • 举报
回复
10楼的方法最简单、快、易懂
v_lcx335 2007-11-22
  • 打赏
  • 举报
回复
答案真的很多,具体哪一条效率高要看执行的情况了,我的建议是用Exists来替换LZ的in,效率会好点。
Croatia 2007-11-21
  • 打赏
  • 举报
回复
arhua119的做法肯定不对,要同时有5月和6月的数据,不是或者。

8楼的想法是对的。

也许会有人提出用EXIST来替换搂主的IN。
艾德 2007-11-21
  • 打赏
  • 举报
回复
8楼给出的应该是目前为止最好答案了。不知道大家有没有意见。如果这周还没有更好的答案就结贴了。
艾德 2007-11-21
  • 打赏
  • 举报
回复
感谢大家的回答,不过请注意我的问题
1,要查出 “5月和6月都有”的用户,而不是“5月或6月都有”
2,5月和6月不是在同一条记录中

4楼和6楼给出的倒是可以查出来,但效率还是有些慢。
JadoNet 2007-11-14
  • 打赏
  • 举报
回复
根据数据量确定使用exists还是in
joexman 2007-11-13
  • 打赏
  • 举报
回复
个人认为:
10楼的应该是最快的查询方法了 。
select * from tablename where extract(month from 访问日期) = 5 or extract(month from 访问日期) = 6
HelloWorld_001 2007-11-13
  • 打赏
  • 举报
回复
to 9楼
你的语句的含义不对
加载更多回复(16)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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