按条件查找

stevenjin 2018-11-17 09:04:58
存储过程,根据传入的两个时间范围参数,将A与B表作连接查询。
如传入2017-01-01,2018-10-10这个两个参数,得到该时间段内的数据。
输入字段为:pid,Name,salary这3项。
数据量非常大,求优化好的SQL语句。

表A:
pid name Intime
1 48 2018-09-03
2 33 2017-02-03
3 23 2016-09-03
4 29 2017-09-03
表B:
pid salary
1 20000
2 49000
3 34343
4 27888
...全文
116 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2018-11-18
  • 打赏
  • 举报
回复
引用 9 楼 stevenjin 的回复:
谢谢大佬们拔云见雾
如果帮到了你,记得结帖
stevenjin 2018-11-17
  • 打赏
  • 举报
回复
谢谢大佬们拔云见雾
吉普赛的歌 2018-11-17
  • 打赏
  • 举报
回复
A 表还要加个索引:
CREATE INDEX ix_A_insertTime ON A(insertTime)
吉普赛的歌 2018-11-17
  • 打赏
  • 举报
回复
--创建索引是提高效率的最快办法
--表A 的 pid 上如果没有索引, 应该创建:
CREATE CLUSTERED INDEX ix_A_pid ON A(pid)
--表B 的 pid 上如无索引, 应该创建
CREATE CLUSTERED UNIQUE ix_B_pid ON B(pid) --B表中 pid 应该是唯一的吧?

--查询类似下面即可,不需要什么 cte 
SELECT 
A.pid
,A.[name]
,B.salary 
FROM A INNER JOIN B ON A.pid=B.pid
WHERE A.Intime BETWEEN '2018-11-01' AND '2018-11-31 23:59:59'

二月十六 2018-11-17
  • 打赏
  • 举报
回复
楼主这种需求的可以试着这样实现,实际根据楼主需要的条件写
WITH temp AS
(
SELECT pid,name,salary FROM A
WHERE
( @thisDate='thisYear' AND Intime BETWEEN '2018-11-01' AND '2018-11-01')
OR (@thisDate='tLASTYear' AND 其他字段=1) --通过这种形式实现
)
SELECT * FROM xst05
吉普赛的歌 2018-11-17
  • 打赏
  • 举报
回复
--所有关于条件的逻辑,在外面写好,不要放在 sql 里面。
--放外面更易懂,而且不会干扰 sql 的执行效率
DECLARE @beginTime DATETIME,@endTime DATETIME,@thisDate NVARCHAR(50)
SET @thisDate='thisYear'
IF @thisDate='thisYear'
BEGIN
	SET @beginTime='2018-11-01'
	SET @endTime='2018-12-01'
END

;WITH temp AS
(
	SELECT pid,
		NAME,
		salary
	FROM   A
	WHERE Intime BETWEEN @beginTime AND @endTime  
) 
SELECT *
FROM   xst05 INNER JOIN temp ON xst05.pid=temp.pid
 
二月十六 2018-11-17
  • 打赏
  • 举报
回复
With as是公共表达式,楼主可以把这个当临时表用。楼主的问题是case when那里写的有问题,then后边不能是判断条件,只能是一个值、字段。
二月十六 2018-11-17
  • 打赏
  • 举报
回复
楼主这个数据量的不算大,性能应该没问题,给关联的pid和查询的时间字段加上索引,如果频繁修改的话,不适合加索引。
stevenjin 2018-11-17
  • 打赏
  • 举报
回复
主要是查询。
刚才正在编辑,群举先回复了,一表的数量10几万条,另一表上万条而已。并不算大。
实际需要是这样,我这里报错了,Intime 找不到,不知怎样用?
我的意思 是with as的用法不懂,在WHERE里面怎样取得查询的字段Intime?

WITH temp AS
(
SELECT pid,name,salary FROM A
WHERE (CASE WHEN @thisDate='thisYear' THEN Intime BETWEEN '2018-11-01' AND '2018-11-01') case when ....)=1
)
SELECT * FROM xst05
吉普赛的歌 2018-11-17
  • 打赏
  • 举报
回复
先回答几个问题: 1. 数据量大, A, B 两个表到底有多大, 具体多少条记录? 精确到万。 2. A 表一个月有多少条数据? 3. 常见的查询起止日期范围是怎么样的? 一个月? 一年? 4. 如果输出的数据太多, 不做分页吗? 5. 这两个表,增、删、改多还是查询多?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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