如何查询多个结构相同的表并且显示表里的记录?

lemontreelau 2006-12-19 03:55:38
在sql中有多个结构相同的表。。
现在要根据一些查询条件来查询表里的记录。。
如有表:
table20061
table20062
table20063等。。这些表是每月自动生成的
表里的字段有sendtime,id

现在要跟据选择的日期查询出表里某日期间的记录
请问要怎么实现呢?
想了好久都没想出来
查询条件为sendtime

主要问题就是搞不懂要怎么查询多个表。。。
因为选择的日期不确定,所以不知道要查几个表。。
...全文
495 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
lemontreelau 2006-12-20
  • 打赏
  • 举报
回复
谢谢楼上的。。。
我又修改了下。。终于可以了。。。。
friendlyFour 2006-12-20
  • 打赏
  • 举报
回复
修改后的
beginSendTime = "2006-01-01" '起始时间
endSendtime = "2006-03-01" '结束时间

intBeginMonth = Month(beginSendTime) '起始时间月
intEndMonth = Month(endSendtime) '结束时间月
intYear=Year(beginSendTime) '既然没有跨年那么取一个日期的年份就可以
sql=""
For i = intBeginMonth To intEndMonth '将表合并为一个表
sql = sql&"select * from [table"&CStr(intYear)&CStr(i)&"]"
If i<>intEndMonth Then
sql = sql & " union all " '当为最后一条的时候不加上union all
End If
Next

Response.write sql&"<br>"
'将合并后的sql作为一个大表加上where
strSql = "select * from ("&sql&")a where a.sendtime>='"&beginSendTime&"' and a.sendtime<='"&endSendtime&"' "
Response.write strSql
lemontreelau 2006-12-20
  • 打赏
  • 举报
回复
usql = usql & sql &" union all "...问题又来了,当为最后一条的时候不加上union all
这个要怎么实现呀?想了半天也没想出来。。。。。
lemontreelau 2006-12-20
  • 打赏
  • 举报
回复
up
lemontreelau 2006-12-20
  • 打赏
  • 举报
回复
用变量嘛,
<%ss=FORMATDATETIME('yyyyMMdd', sendtime)%>
然后SQL语句中用到该变量
select * from table<%=ss%>
-------------------------------------------------
我的示例,也许有bug你要自己改一下。
beginSendTime = "2006-01-01"'起始时间
endSendtime = "2006-12-01"'结束时间

intBeginMonth = Month(beginSendTime)'起始时间月
intEndMonth = Month(endSendtime)'结束时间月
intYear=Year(beginSendTime)'既然没有跨年那么取一个日期的年份就可以

For i = intBeginMonth To intEndMonth'将表合并为一个表
sql = "select * from [table"&CStr(intYear)&CStr(intBeginMonth)&"]"
If intBeginMonth<>intEndMonth Then
sql = sql & " union all "'当为最后一条的时候不加上union all
End If
Next

'将合并后的sql作为一个大表加上where
strSql = "select * from ("&sql&")a where a.sendtime>='"&beginSendTime&"' and a.sendtime<='"&endSendtime&"' "
rs.open strSql,conn,1,1
-------------------------------------------------------------------------------
我还是决定用你提供的上面这种方法。。。
正在调试中。。
If intBeginMonth<>intEndMonth Then
sql = sql & " union all "'当为最后一条的时候不加上union all
End If
sql = sql & " union all "...这句,怎么没法把所有的SQL追加成一个大的sqkl表呢。。
friendlyFour 2006-12-20
  • 打赏
  • 举报
回复
今天还有些空闲,明天就没了,呵呵。有问题就说好了。
感觉这个问题的解决(如果你是初学的话)你不好解决,最好让那个数据库是另一个同事在做的那个人去弄。
lemontreelau 2006-12-20
  • 打赏
  • 举报
回复
谢谢friendlyFour(web开发四人组)讲得好详细,昨天下班回家了,
今天我再研究下。。。有问题再请教哦。。。
plought 2006-12-19
  • 打赏
  • 举报
回复

唉!!先天不足的数据库注定就是麻烦事儿越来越多啊!

没法说!

解决了今天的麻烦,谁知道明天会不会再出来更多的麻烦,没完没了!!
tangqiaojie 2006-12-19
  • 打赏
  • 举报
回复
friendlyFour(web开发四人组) 讲得好详细、好深入、好。。。

不过LZ不知道晕没
verystrong 2006-12-19
  • 打赏
  • 举报
回复
既然表的名称是有规律的,就没必要那么麻烦
就像catsong()说的,用变量就行了
sendtime=cdate(request("sendstime"))
sendyear=year(sendtime)
sendmonth=month(sendtime)
sql="select * from table" & cstr(sendyear) & cstr(sendmonth) & " where ...."
friendlyFour 2006-12-19
  • 打赏
  • 举报
回复
在到sql帮助中搜索 create PROCEDURE
friendlyFour 2006-12-19
  • 打赏
  • 举报
回复
对的,是由于数据量大的原因所以做了分表处理。。。。
---------------------------------
看到了这个我上边的示例恐怕不能满足你。你看看这个吧
---------------------------------------------
1、最简单的如下
Dim objConn
Set objConn = Server.CreateObject("ADOBD.Connection")
objConn.Open Application("Connection_String")
'Call the stored procedure to increment a counter on the page
objConn.Execute "exec sp_AddHit"
没有参数,没有返回,没有错误处理,就是这个了

2、带参数的一种调用
objConn.Execute "exec sp_AddHit 'http://www.aspalliance.com', 1"
请注意分割参数,该方法也不返回记录

3、返回记录的
Dim objConn
Dim objRs
Set objConn = Server.CreateObject("ADOBD.Connection")
Set objRs = Server.CreateObject("ADOBD.Recordset")
objConn.Open Application("Connection_String")
'Call the stored procedure to increment a counter on the page
objRs.Open objConn, "exec sp_ListArticles '1/15/2001'"
'Loop through recordset and display each article

4、使用Command对象操作

Dim objConn
Dim objCmd
'Instantiate objects
Set objConn = Server.CreateObject("ADODB.Connection")
set objCmd = Server.CreateObject("ADODB.Command")
conn.Open Application("ConnectionString")

With objCmd
.ActiveConnection = conn 'You can also just specify a connection string here
.CommandText = "sp_InsertArticle"
.CommandType = adCmdStoredProc 'Requires the adovbs.inc file or typelib meta tag
'objCmd.CommandType = 2 为视图
'objCmd.CommandType = 4 为存储过程

'Add Input Parameters
.Parameters.Append .CreateParameter("@columnist_id", adDouble, adParamInput, , columnist_id)
.Parameters.Append .CreateParameter("@url", adVarChar, adParamInput, 255, url)
.Parameters.Append .CreateParameter("@title", adVarChar, adParamInput, 99, url)
.Parameters.Append .CreateParameter("@description", adLongVarChar, _
adParamInput, 2147483647, description)

'Add Output Parameters
.Parameters.Append .CreateParameter("@link_id", adInteger, adParamOutput, , 0)

'Execute the function
'If not returning a recordset, use the adExecuteNoRecords parameter option
.Execute, , adExecuteNoRecords
link_id = .Parameters("@link_id")
End With

5、存储过程的代码
Create PROCEDURE dbo.sp_InsertArticle
(
@columnist_id int,
@url varchar(255),
@title varchar(99),
@description text
@link_id int OUTPUT
)
AS
BEGIN
INSERT INTO dbo.t_link (columnist_id,url,title,description)
VALUES (@columnist_id,@url,@title,@description)

SELECT @link_id = @@IDENTITY
END


6.调用视图
<%
Set Dataconn = Server.CreateObject("ADODB.Connection") '建立连接对象
Dataconn.Open "DSN=SinoTrans;SERVER=APP_SERVER;UID=sa;PWD=;APP=Microsoft (R) Developer Studio;WSID=APP_SERVER;Regional=Yes"
Set cmdTemp = Server.CreateObject("ADODB.Command") '建立命令对象
Set rst= Server.CreateObject("ADODB.Recordset") '建立记录集对象
cmdTemp.CommandText = "Customers "
cmdTemp.CommandType = 2
Set cmdTemp.ActiveConnection = DataConn
rst.Open cmdTemp, , 1, 3 '生成查询结果
%>

7.使用事务处理

①.Asp内嵌的事务支持

例子:
use_transaction_1.asp
<%
'Asp中使用事务
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "course_dsn","course_user","course_password"
conn.begintrans '开始事务

sql="delete from user_info"
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,3,3
if conn.errors.count>0 then '有错误发生
conn.rollbacktrans '回滚
set rs=nothing
conn.close
set conn=nothing
response.write "交易失败,回滚至修改前的状态!"
response.end
else
conn.committrans '提交事务
set rs=nothing
conn.close
set conn=nothing
response.write "交易成功!"
response.end
end if
%>

②.数据库级的事务

i.创建存储过程

CREATE PROCEDURE [user_info_2]
(@user_name varchar(40),@password varchar(20))
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
delete from user_info where user_name=@user_name and password=@password
COMMIT TRANSACTION
SET XACT_ABORT OFF

ii.在Asp中调用

use_transaction_2.asp
<%
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "course_dsn","course_user","course_password"

sql="user_info_2 '"&request.querystring("user_name")&"','"&request.querystring("password")&"'"

set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,1
set rs=nothing
conn.close
set conn=nothing
%>
friendlyFour 2006-12-19
  • 打赏
  • 举报
回复
先去看一下sql联机帮助中的union,里面有理论也有示例,这个是解决把在各个表查询的记录合到一个表里解决办法。而至于使用view(视图)还是proc(存储过程)都是你实现的手段。
对于你是初学的话那么使用catsong()的方法比较适合你。
-------------------------------------------------
用变量嘛,
<%ss=FORMATDATETIME('yyyyMMdd', sendtime)%>
然后SQL语句中用到该变量
select * from table<%=ss%>
-------------------------------------------------
我的示例,也许有bug你要自己改一下。
beginSendTime = "2006-01-01" '起始时间
endSendtime = "2006-12-01" '结束时间

intBeginMonth = Month(beginSendTime) '起始时间月
intEndMonth = Month(endSendtime) '结束时间月
intYear=Year(beginSendTime) '既然没有跨年那么取一个日期的年份就可以

For i = intBeginMonth To intEndMonth '将表合并为一个表
sql = "select * from [table"&CStr(intYear)&CStr(intBeginMonth)&"]"
If intBeginMonth<>intEndMonth Then
sql = sql & " union all " '当为最后一条的时候不加上union all
End If
Next

'将合并后的sql作为一个大表加上where
strSql = "select * from ("&sql&")a where a.sendtime>='"&beginSendTime&"' and a.sendtime<='"&endSendtime&"' "
rs.open strSql,conn,1,1
lemontreelau 2006-12-19
  • 打赏
  • 举报
回复
说点其他的。你的同事用此种方法去做即:table+年+月,是否是由于数据量大的原因作了分表的处理,如果是那么在查询sendtime(一个时间段的时候)提取数据的速度是一个问题,这方面你还要自己看看资料了。如,索引什么的。
---------------------------------------------------------
对的,是由于数据量大的原因所以做了分表处理。。。。
lemontreelau 2006-12-19
  • 打赏
  • 举报
回复
能不能请教下存储过程具体要怎么写??
friendlyFour 2006-12-19
  • 打赏
  • 举报
回复
说点其他的。你的同事用此种方法去做即:table+年+月,是否是由于数据量大的原因作了分表的处理,如果是那么在查询sendtime(一个时间段的时候)提取数据的速度是一个问题,这方面你还要自己看看资料了。如,索引什么的。
lemontreelau 2006-12-19
  • 打赏
  • 举报
回复
我想知道用户是根据sendtime的条件来检索数据那么是否向我刚才说过的:
输入2006-01-01到2006-12-01
就要查询table200601、table200602 .... table200611 、table200612
是这样吧?如果是那么可以采用我发的第二个回复中的内容,用proc动态创建union all 的大表。
----------------------------------------------------------------------
是的。。是用sendtime的条件来检索数据。。
可是我不太清楚怎么proc动态创建union all 的大表。。
不清楚 怎么把在各个表查询的记录合到一个表里。。。
因为不确定要查几张表。。是用循环来查询每张月表吗?
查询的时候不用跨年的。。。。
lemontreelau 2006-12-19
  • 打赏
  • 举报
回复
楼上的。。其实是因为数据库是另一个同事在做。。。
我是做编写代码部分,所以想找个最适合的方法来解决这个问题。。
我刚接触ASP,,所以想请教下最好的解决方法。。。
谢谢你讲了那么多。。。学习到了很多。。
friendlyFour 2006-12-19
  • 打赏
  • 举报
回复
我想知道用户是根据sendtime的条件来检索数据那么是否向我刚才说过的:
输入2006-01-01到2006-12-01
就要查询table200601、table200602 .... table200611 、table200612
是这样吧?如果是那么可以采用我发的第二个回复中的内容,用proc动态创建union all 的大表。
friendlyFour 2006-12-19
  • 打赏
  • 举报
回复
其实:peijunfeng(爱篮球) ( ) 信誉:100
已经说得很清楚了,你的表如:table200601是自动建立的那么他是怎么自动建立的呢,应该是一个job吧,每个月自动建立一个名为table+年+月,那么可以在这个job的存储过程中修改,建立一个view或修改原有建好的view,将这个月产生的表建立在你的这个view中(也是自动生成的)。
你现在要做的是采取哪个方案,是按照我说的建立view还是proc后再去解决你实际应用中的技术或其他问题。
加载更多回复(12)

28,390

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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