SQL问题!搞了一天,搞不定!!

koukoujiayi 2009-05-29 12:09:51
表---T1
CALLNO RECNO 进年 COUNT
A12345 10001 2008 4
A12345 10001 2007 6
A56789 10002 2008 2
A56789 10002 2007 3
B00000
C00000
............

表---T2
CALLNO 进年 出年
A12345 2008 2009
A12345 2008 2009
A12345 2008 2009
A12345 2008 2008
A12345 2008 2008
A12345 2007 2009
A12345 2007 2008
A12345 2007 2008
A12345 2007 2007
A56789 2008 2009
A56789 2008 2008
A56789 2008 2008
A56789 2008 2008
A56789 2007 2008
A56789 2007 2007
B00000
B00000
..........

如果是 ...where LEFT(T1.CALLNO,1)='A' AND 进年='2008' AND T2.出年>='2008 and T2.出年<='2008'
得到
CALLNO RECNO COUNT 数量
A12345 10001 4 2
A56789 20001 2 3
......

如果是 ...where LEFT(T1.CALLNO,1)='A' AND 进年='2008' AND T2.出年>='2008 and T2.出年<='2009'
得到
CALLNO RECNO COUNT 数量
A12345 10001 4 5
A56789 20001 2 4
......

如果是 ...where LEFT(T1.CALLNO,1)='A' AND 进年='2007' AND T2.出年>='2007 and T2.出年<='2009'
得到
CALLNO RECNO COUNT 数量
A12345 10001 6 4
A56789 20001 3 2
......

以上表都是视图得到的,主要问题是“数量“,
我建了一个函数来统计,能够得到结果,但由于数据量大(100万左右),速度非常慢,链接有时都会超时,所以显然不行,
请教各位达人,望指教!!万分感谢!!


附:我建的函数:
CREATE FUNCTION dbo.myFunc(@myCallNo varchar(30),@InYEAR varchar(4), @OutYEAR varchar(4))
RETURNS int
AS
BEGIN
DECLARE @RE int
SET @RE = 0
SELECT @RE = @RE +1
FROM T2
WHERE (CALLNO=@myCallNo) AND (进年=@InYEAR) AND (出年 >= @InYEAR AND 出年 <= @OutYEAR)
RETURN @RE
END

select 语句
SELECT T1.CALLNO, T1.RECNO, T1.COUNT, dbo.myFunc(T1.CALLNO, '2008', '2009') AS 数量
FROM T1
WHERE (LEFT(T1.CALLNO), 1) = 'A') AND (T1.进年 = '2008')

如果是类似以上的函数速度完全不行!!!!!
...全文
166 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
koukoujiayi 2009-05-29
  • 打赏
  • 举报
回复
5楼的提供的,测试了以下速度没有明显的提高!!
koukoujiayi 2009-05-29
  • 打赏
  • 举报
回复
非常感谢楼上各位:
2楼提供的速度非常快,佩服+感谢!!
由于我疏忽,2楼提供的代码还缺少一种情况,例如以下红色部分:
表---T1
CALLNO RECNO 进年 COUNT
A12345 10001 2008 4
A12345 10001 2007 6
A56789 10002 2008 2
A56789 10002 2007 3
A00001 10003 2008 7
A00002 10004 2007 9

B00000
C00000
............
在表T2中没有A00001的记录,希望也能列出,如:
如果是 ...where LEFT(T1.CALLNO,1)='A' AND 进年='2008' AND T2.出年>='2008 and T2.出年 <='2008'
得到
CALLNO RECNO COUNT 数量
A12345 10001 4 2
A56789 10002 2 3
A00001 10003 7 0

望指教!!谢谢!
jiangshun 2009-05-29
  • 打赏
  • 举报
回复
树哥,你在啊,我刚才在弄下午那个问题,在.net版,好冷清哦,那边
百年树人 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 josy 的回复:]
其实没有完全看懂楼主的意思,写一个试试

SQL code---测试数据---
if object_id('[T1]') is not null drop table [T1]
go
create table [T1]([CALLNO] varchar(6),[RECNO] int,[进年] int,[COUNT] int)
insert [T1]
select 'A12345',10001,2008,4 union all
select 'A12345',10001,2007,6 union all
select 'A56789',10002,2008,2 union all
select 'A56789',10002,2007,3
if object_id('[T2]') is not null drop t…
[/Quote]
又测试了一下,应该是这样才对
select
t2.callno,
t1.recno,
t1.[count],
count(t2.callno) as 数量
from
T1,T2
where
t1.callno=t2.callno
and
t1.进年=t2.进年
and
LEFT(T1.CALLNO,1)='A' AND t1.进年=2008 AND T2.出年 between 2008 and 2008
group by
t2.callno,
t1.recno,
t1.[count]

/**
callno recno count 数量
------ ----------- ----------- -----------
A12345 10001 4 2
A56789 10002 2 3

(所影响的行数为 2 行)
**/

select
t2.callno,
t1.recno,
t1.[count],
count(t2.callno) as 数量
from
T1,T2
where
t1.callno=t2.callno
and
t1.进年=t2.进年
and
LEFT(T1.CALLNO,1)='A' AND t1.进年=2008 AND T2.出年 between 2008 and 2009
group by
t2.callno,
t1.recno,
t1.[count]

/**
callno recno count 数量
------ ----------- ----------- -----------
A12345 10001 4 5
A56789 10002 2 4

(所影响的行数为 2 行)
**/

select
t2.callno,
t1.recno,
t1.[count],
count(t2.callno) as 数量
from
T1,T2
where
t1.callno=t2.callno
and
t1.进年=t2.进年
and
LEFT(T1.CALLNO,1)='A' AND t1.进年=2007 AND T2.出年 between 2007 and 2009
group by
t2.callno,
t1.recno,
t1.[count]

/**
callno recno count 数量
------ ----------- ----------- -----------
A12345 10001 6 4
A56789 10002 3 2

(所影响的行数为 2 行)
**/
百年树人 2009-05-29
  • 打赏
  • 举报
回复
其实没有完全看懂楼主的意思,写一个试试
---测试数据---
if object_id('[T1]') is not null drop table [T1]
go
create table [T1]([CALLNO] varchar(6),[RECNO] int,[进年] int,[COUNT] int)
insert [T1]
select 'A12345',10001,2008,4 union all
select 'A12345',10001,2007,6 union all
select 'A56789',10002,2008,2 union all
select 'A56789',10002,2007,3
if object_id('[T2]') is not null drop table [T2]
go
create table [T2]([CALLNO] varchar(6),[进年] int,[出年] int)
insert [T2]
select 'A12345',2008,2009 union all
select 'A12345',2008,2009 union all
select 'A12345',2008,2009 union all
select 'A12345',2008,2008 union all
select 'A12345',2008,2008 union all
select 'A12345',2007,2009 union all
select 'A12345',2007,2008 union all
select 'A12345',2007,2008 union all
select 'A12345',2007,2007 union all
select 'A56789',2008,2009 union all
select 'A56789',2008,2008 union all
select 'A56789',2008,2008 union all
select 'A56789',2008,2008 union all
select 'A56789',2007,2008 union all
select 'A56789',2007,2007

---查询---
select
t2.callno,
t1.recno,
t1.[count],
count(t2.callno) as 数量
from
T1,T2
where
t1.callno=t2.callno
and
LEFT(T1.CALLNO,1)='A' AND t1.进年='2008' AND T2.进年>='2008' and T2.出年 <='2008'
group by
t2.callno,
t1.recno,
t1.[count]

---结果---
callno recno count 数量
------ ----------- ----------- -----------
A12345 10001 4 2
A56789 10002 2 3

(所影响的行数为 2 行)

slowone 2009-05-29
  • 打赏
  • 举报
回复
select t2.callno,t1.recno,t1.count,COUNT(t2.callno) 数量
from t2 join t1
on t2.callno=t1.callno and t2.进年=t1.进年
where left(t2.callno,1)='A' and t2.进年=2008 and t2.出年=2009
group by t1.recno,t1.count,t2.callno
szldk 2009-05-29
  • 打赏
  • 举报
回复
关注
claro 2009-05-29
  • 打赏
  • 举报
回复
帮顶
ChinaJiaBing 2009-05-29
  • 打赏
  • 举报
回复

以上表都是视图得到的,主要问题是“数量“,
我建了一个函数来统计,能够得到结果,但由于数据量大(100万左右),速度非常慢,链接有时都会超时,所以显然不行,
请教各位达人,望指教!!万分感谢!!

换成存储过程吧..
goregrypeck 2009-05-29
  • 打赏
  • 举报
回复
恩,1楼回答的很详细了
  • 打赏
  • 举报
回复

1、CREATE FUNCTION dbo.myFunc(@myCallNo varchar(30),@InYEAR varchar(4), @OutYEAR varchar(4))
RETURNS int
AS
BEGIN
DECLARE @RE int

SELECT @RE = count(t2.callno)
FROM T2
WHERE (CALLNO=@myCallNo) AND (进年=@InYEAR) AND (出年 >= @InYEAR AND 出年 <= @OutYEAR)
RETURN @RE
END

试试。
koukoujiayi 2009-05-29
  • 打赏
  • 举报
回复
ok!!十分十分的感谢josy大虾!!
百年树人 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 koukoujiayi 的回复:]
根据josy的代码,凡t2中没有t1记录的"数量"一栏都变成了1,什么道理???
[/Quote]
应该不可能是1的,除非在t2中有一条记录,不过我上面的语句也有一点小问题
更正和测试了一下

---测试数据---
if object_id('[T1]') is not null drop table [T1]
go
create table [T1]([CALLNO] varchar(6),[RECNO] int,[进年] int,[COUNT] int)
insert [T1]
select 'A12345',10001,2008,4 union all
select 'A12345',10001,2007,6 union all
select 'A56789',10002,2008,2 union all
select 'A56789',10002,2007,3 union all
select 'A00001',10003,2008,7
if object_id('[T2]') is not null drop table [T2]
go
create table [T2]([CALLNO] varchar(6),[进年] int,[出年] int)
insert [T2]
select 'A12345',2008,2009 union all
select 'A12345',2008,2009 union all
select 'A12345',2008,2009 union all
select 'A12345',2008,2008 union all
select 'A12345',2008,2008 union all
select 'A12345',2007,2009 union all
select 'A12345',2007,2008 union all
select 'A12345',2007,2008 union all
select 'A12345',2007,2007 union all
select 'A56789',2008,2009 union all
select 'A56789',2008,2008 union all
select 'A56789',2008,2008 union all
select 'A56789',2008,2008 union all
select 'A56789',2007,2008 union all
select 'A56789',2007,2007


select
t1.callno,
t1.recno,
t1.[count],
ISNULL(count(t2.callno),0) as 数量
from
T1
LEFT JOIN
T2
ON
t1.callno=t2.callno
and
t1.进年=t2.进年
and
T2.出年 between 2008 and 2008
WHERE
LEFT(T1.CALLNO,1)='A' AND t1.进年=2008
group by
t1.callno,
t1.recno,
t1.[count]

/**
callno recno count 数量
------ ----------- ----------- -----------
A00001 10003 7 0
A12345 10001 4 2
A56789 10002 2 3

(所影响的行数为 3 行)
**/
koukoujiayi 2009-05-29
  • 打赏
  • 举报
回复
根据josy的代码,凡t2中没有t1记录的"数量"一栏都变成了1,什么道理???
kgwp13726209532 2009-05-29
  • 打赏
  • 举报
回复
好高深
百年树人 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 koukoujiayi 的回复:]
非常感谢楼上各位:
2楼提供的速度非常快,佩服+感谢!!
由于我疏忽,2楼提供的代码还缺少一种情况,例如以下红色部分:
表---T1
CALLNO RECNO 进年 COUNT
A12345 10001 2008 4
A12345 10001 2007 6
A56789 10002 2008 2
A56789 10002 2007 3
A00001 10003 2008 7
A00002 10004 2007 9
B00000
C00000
............
在表T2中没有A00001的记录,希望也能列出,如:
如果是 …
[/Quote]

select
t2.callno,
t1.recno,
t1.[count],
ISNULL(count(t2.callno),0) as 数量
from
T1
LEFT JOIN
T2
ON
t1.callno=t2.callno
and
t1.进年=t2.进年
and
T2.出年 between 2008 and 2008
WHERE
LEFT(T1.CALLNO,1)='A' AND t1.进年=2008
group by
t2.callno,
t1.recno,
t1.[count]
you_tube 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 koukoujiayi 的回复:]
5楼的提供的,测试了以下速度没有明显的提高!!
[/Quote]

加了索引?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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