求找一简单,最有效(最快)的SQL句子。。

hx 2002-04-21 04:41:39
表A ID 表B DD 表C ID DD SUM DATE 设:DATA 为 2002/04/..
1 1 1 1 50 1
2 2 1 1 40 3
3 1 1 50 5
1 2 30 2
1 2 60 4
2 2 10 3
3 2 10 1
3 2 30 2
3 2 70 3
查询关系:
查询时,指定ID DD 和日期范围,如查 DATE=3,ID 1,2 DD 1;显示3号及以后的数据,没有,指定日期的数据,以前面,最近日期为准,显示SUM。如果找不到ID,DD,最近日期,如ID=1,DD=2,DATE=1,显示SUM=0


----查询生成结果-------
设 查 DATE为1-5 (这里,结果,我打成并列)
第一列 第二列 第三列
ID DD SUM DATE | ID DD SUM DATE | ID DD SUM DATE
1 1 50 1 1 2 0 1 2 1 0 1
1 1 50 2 1 2 30 2 2 1 0 2
1 1 40 3 1 2 30 3 2 1 0 3
1 1 40 4 1 2 60 4 2 1 0 4
1 1 50 5 1 2 60 5 2 1 0 5

ID DD SUM DATE | ID DD SUM DATE | ID DD SUM DATE
2 2 0 1 3 1 0 1 3 2 10 1
2 2 0 2 3 1 0 2 3 2 30 2
2 2 10 3 3 1 0 3 3 2 70 3
2 2 10 4 3 1 0 4 3 2 70 4
2 2 10 5 3 1 0 5 3 2 70 5
...全文
32 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hx 2003-02-15
  • 打赏
  • 举报
回复
原来我是,按指令来做的。。
Yang_ 2002-04-22
  • 打赏
  • 举报
回复
试一下光是:
select id, dd, d_date
from tableA A, tableB B, tableD D
order by id, dd, d_date

需要的时间,因为可以考虑先
select id, dd,d_date,0 as c_Sum
from tableA A, tableB B, tableD D
order by id, dd, d_date
插入到一个临时表,再用UPDATE来填c_Sum,速度可能会快些。
Yang_ 2002-04-22
  • 打赏
  • 举报
回复
原来怎么做的?
hx 2002-04-22
  • 打赏
  • 举报
回复
成功了,但超超慢!!,比我原来的,还慢。。。(不知道几分钟了,原来还只有一到两分钟)
看来,这个问题,已经出了SQL语句的范围。。大家看看,其它的方法吧。。。。

看来,要正式讨论才行了
:(

补充说明一下, 现实情况。。。
表A ID 为 330 个 或以上。
表B ID 为 7个 或以上,(我这里是8个)
表C 就不说了。。太多了 最少也是10000以上,加两个字段 SUM1、SUM2(作用和SUM相同)
表D 也就是日期。。。自己生成。。

Yang_ 2002-04-22
  • 打赏
  • 举报
回复
ACCESS里不支持TOP

select id, dd, d_date,
c_sum=(select c_sum from tableC C
where C.id = A.id
and C.dd = B.dd
and C.d_date = (
select NAX(d_date) AS d_date from tableC E
where E.id = A.id
and E.dd = B.dd
and E.d_date <= D.d_date
)
)
from tableA A, tableB B, tableD D
order by id, dd, d_date

这是单列的。
hx 2002-04-22
  • 打赏
  • 举报
回复
算了,先不管NULL了。。

select id, dd, d_date,
c_sum=(select top 1 c_sum from tableC C
where id = A.id
and dd = B.dd
and d_date <= D.d_date
order by d_date Desc)
from tableA A, tableB B, tableD D
order by id, dd, d_date

在第二个子句里 TOP 1 就是不能执行。。
但ACCESS又是支持 TOP 1 的。。
Yang_ 2002-04-22
  • 打赏
  • 举报
回复
试一下IIF和ISNULL配合,不过不知道这样行不行,我没有得试。

select id, dd, d_date,
c_sum=IIF(ISNULL(select top 1 c_sum from tableC C
where id = A.id
and dd = B.dd
and d_date <= D.d_date
order by d_date Desc),0,(select top 1 c_sum from tableC C
where id = A.id
and dd = B.dd
and d_date <= D.d_date
order by d_date Desc))
from tableA A, tableB B, tableD D
order by id, dd, d_date
Yang_ 2002-04-22
  • 打赏
  • 举报
回复
试一下IIF和ISNULL配合,不过不知道这样行不行,我没有得试。

select id, dd, d_date,
c_sum=IIF(ISNULL(select top 1 c_sum from tableC C
where id = A.id
and dd = B.dd
and d_date <= D.d_date
order by d_date Desc),0,(select top 1 c_sum from tableC C
where id = A.id
and dd = B.dd
and d_date <= D.d_date
order by d_date Desc))
from tableA A, tableB B, tableD D
order by id, dd, d_date
KingSunSha 2002-04-22
  • 打赏
  • 举报
回复
Access对sql有很多限制,我试了半天,搞不出一个sql能完成你的要求的,至少要分2步,行不行啊?
hx 2002-04-22
  • 打赏
  • 举报
回复
问题还在ACCESS里,怎么办。。这ISNULL的
Yang_ 2002-04-22
  • 打赏
  • 举报
回复
SQL SERVER:
select id, dd, d_date,
c_sum=ISNULL((select c_sum from tableC C
where C.id = A.id
and C.dd = B.dd
and C.d_date = (
select MAX(d_date) AS d_date from tableC E
where E.id = A.id
and E.dd = B.dd
and E.d_date <= D.d_date
)
) ,0)
from tableA A, tableB B, tableD D
order by id, dd, d_date

hx 2002-04-22
  • 打赏
  • 举报
回复
在ACCESS里,出错啊。。。
select id, dd, d_date,
c_sum=(select top 1 c_sum from tableC C
where id = A.id
and dd = B.dd
and d_date <= D.d_date
order by d_date Desc)
from tableA A, tableB B, tableD D
order by id, dd, d_date
KingSunSha 2002-04-21
  • 打赏
  • 举报
回复
sql server(tableD为日期的临时表,列为d_date,另外不要用sum/date之类的作字段名):

select id, dd, d_date,
c_sum=(select top 1 c_sum from tableC C
where id = A.id
and dd = B.dd
and d_date <= D.d_date
order by d_date desc),
from from tableA A, tableB B, tableD D
order by id, dd, d_date;
hx 2002-04-21
  • 打赏
  • 举报
回复
用ACCESS和SQL。。
可建临时表,(以前,也是对DATE建了临时表,:),不建,我就不知道怎么办了)

高效,放在第一位(呵呵,放在程序里,又没人看)
简单的话,句子结构真的能很简单吗?


KingSunSha 2002-04-21
  • 打赏
  • 举报
回复
这个问题的难点在于必须填补table_A join table_B for each dates中在table_C找不到的纪录,如果能建立一个date临时表,那就很容易了。现在不知道用的哪种数据库,所以没法给出具体的代码。
Yang_ 2002-04-21
  • 打赏
  • 举报
回复
说明数据库!说明能不能用临时表。
说明简单和高效哪一个放第一位。

34,576

社区成员

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

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