由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 如何在数据库中进行复杂查询, 但不把中间结果放到程序内存
相关主题
Late afternoon 腦不好使请教一个小白Query 问题
菜鸟急问ORACLE里FUNCTION返回ref cursor的问题请教oracle sql query question
SQL query 一问问个问题
Need help on finding dependency objects这个query对么?
老印给我的一个Challenge请教teradata问题
怎么求和Job openings with Teradata (zt)
怎么reference temp table的column[Mysql] how to return NULL count in group by query (转载)
请教一个query in mysqlcursor可以往回找否??
相关话题的讨论汇总
话题: sql话题: query话题: curse话题: cursor话题: 数据库
进入Database版参与讨论
1 (共1页)
s******n
发帖数: 34
1
我是数据库新手, 请大家指点, 谢谢!
我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
我的查询是针对多个表的, 比如说查到了一些结果,
然后对这些结果再查询其他数据表...
最后做一个update
我可以在程序内存中保留中间查询结果, 然后再处理.
但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
直接在数据库中实现. 不知道应该如何写这个样的语句?
或者说数据库的什么机制就可以实现这个的功能?
我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.
谢谢!
B*****g
发帖数: 34098
2
1. 首先,你得告诉我们你用啥数据库
2. google "store procedure"

了.

【在 s******n 的大作中提到】
: 我是数据库新手, 请大家指点, 谢谢!
: 我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
: 我的查询是针对多个表的, 比如说查到了一些结果,
: 然后对这些结果再查询其他数据表...
: 最后做一个update
: 我可以在程序内存中保留中间查询结果, 然后再处理.
: 但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
: 直接在数据库中实现. 不知道应该如何写这个样的语句?
: 或者说数据库的什么机制就可以实现这个的功能?
: 我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.

j*****n
发帖数: 1781
3
感觉你这个也就一个 UPDATE 带一串比较复杂的QUERY CONDITIONS 就搞定了。
n********6
发帖数: 1511
4
My general comments. Please feel free to give me some comments.
How often do you do the query? once per minute? 10 times per hour? or 20
times per day?
How long does the query run? 3 seconds? 30 seconds? or 3 minutes?
If your query run for 3 seconds or less per time, and even once per minute,
just do as simple as you can do. Simple is good. :)

了.

【在 s******n 的大作中提到】
: 我是数据库新手, 请大家指点, 谢谢!
: 我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
: 我的查询是针对多个表的, 比如说查到了一些结果,
: 然后对这些结果再查询其他数据表...
: 最后做一个update
: 我可以在程序内存中保留中间查询结果, 然后再处理.
: 但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
: 直接在数据库中实现. 不知道应该如何写这个样的语句?
: 或者说数据库的什么机制就可以实现这个的功能?
: 我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.

s******n
发帖数: 34
5
谢谢啊!
要用的数据库最大可能是sql server, 也有可能是oracle, 这个希望两者都可以
好,我去看看store procedure

【在 B*****g 的大作中提到】
: 1. 首先,你得告诉我们你用啥数据库
: 2. google "store procedure"
:
: 了.

s******n
发帖数: 34
6
没错, 就是一个update
这个query应该是相当复杂的, (当然只是根据我自己接触定义的)。
比如说我要查询的表的名字就要通过查询其他的表来得到
其实通过程序也可以实现。
但是现在想直接在数据库上面实现, 然后程序只要执行这些语句就行了。
我想也许要建立一些临时表格放一些中间结果。

【在 j*****n 的大作中提到】
: 感觉你这个也就一个 UPDATE 带一串比较复杂的QUERY CONDITIONS 就搞定了。
s******n
发帖数: 34
7

The frequency can be configured, for more accurate results, more often.
I would like to say 10 times per hour
The run time query depends on the size of some table, so might be very long,
or very short (seems said nothing...)
Thanks!
,

【在 n********6 的大作中提到】
: My general comments. Please feel free to give me some comments.
: How often do you do the query? once per minute? 10 times per hour? or 20
: times per day?
: How long does the query run? 3 seconds? 30 seconds? or 3 minutes?
: If your query run for 3 seconds or less per time, and even once per minute,
: just do as simple as you can do. Simple is good. :)
:
: 了.

s******n
发帖数: 34
8
我补充一个简单的流程吧, 谢谢大家的意见。
第一步:
query on T1, T2 得到下面要查询的一些表的名字
对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
把这些记录中放到自己建的一个表 T
下面是另外一些对T的处理:
第二步:
对于T的每条记录,
判断是否还是valid?
是valid, 是否需要update?
是要update, 然后根据一些条件去update另外一个表。

了.

【在 s******n 的大作中提到】
: 我是数据库新手, 请大家指点, 谢谢!
: 我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
: 我的查询是针对多个表的, 比如说查到了一些结果,
: 然后对这些结果再查询其他数据表...
: 最后做一个update
: 我可以在程序内存中保留中间查询结果, 然后再处理.
: 但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
: 直接在数据库中实现. 不知道应该如何写这个样的语句?
: 或者说数据库的什么机制就可以实现这个的功能?
: 我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.

j*****n
发帖数: 1781
9
some key words you may need:
temp table
dynamic sql
sure you need a stored procedure

【在 s******n 的大作中提到】
: 我补充一个简单的流程吧, 谢谢大家的意见。
: 第一步:
: query on T1, T2 得到下面要查询的一些表的名字
: 对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
: 把这些记录中放到自己建的一个表 T
: 下面是另外一些对T的处理:
: 第二步:
: 对于T的每条记录,
: 判断是否还是valid?
: 是valid, 是否需要update?

s******n
发帖数: 34
10
我写了下面的一段:
declare @name nvarchar(30)
declare @no int
declare curse insensitive cursor for select tabname from tabs
open curse
fetch next from curse into @name
while @@fetch_status = 0
begin
declare sub_curse insensitive cursor for
select no from tab T1 join @name T2 on T1.a = T2.a and T1.b = T2.b
open sub_curse
fetch next from sub_curse into @no
while @@fetch_status = 0
begin
--print @no
fetch next from sub_curse into @no
end
close sub_curse
deallo

【在 j*****n 的大作中提到】
: some key words you may need:
: temp table
: dynamic sql
: sure you need a stored procedure

相关主题
怎么求和请教一个小白Query 问题
怎么reference temp table的column请教oracle sql query question
请教一个query in mysql问个问题
进入Database版参与讨论
j*****n
发帖数: 1781
11
//faint, dynamic sql 不是你这么用的。
查查 sp_executesql 是怎么用的吧。
A*L
发帖数: 2357
12
temptable?

了.

【在 s******n 的大作中提到】
: 我是数据库新手, 请大家指点, 谢谢!
: 我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
: 我的查询是针对多个表的, 比如说查到了一些结果,
: 然后对这些结果再查询其他数据表...
: 最后做一个update
: 我可以在程序内存中保留中间查询结果, 然后再处理.
: 但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
: 直接在数据库中实现. 不知道应该如何写这个样的语句?
: 或者说数据库的什么机制就可以实现这个的功能?
: 我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.

n********6
发帖数: 1511
13
Why do you suggest dynamic sql?
Why not make it simple and avoid using dynamic sql?

【在 j*****n 的大作中提到】
: //faint, dynamic sql 不是你这么用的。
: 查查 sp_executesql 是怎么用的吧。

n********6
发帖数: 1511
14
Good coding logic and writing style for self-learners.
Now you are doing debug.
Try to separate code into small units and test it. Do not test all the code
together.
For example, test the query first, then test the update.

【在 s******n 的大作中提到】
: 我写了下面的一段:
: declare @name nvarchar(30)
: declare @no int
: declare curse insensitive cursor for select tabname from tabs
: open curse
: fetch next from curse into @name
: while @@fetch_status = 0
: begin
: declare sub_curse insensitive cursor for
: select no from tab T1 join @name T2 on T1.a = T2.a and T1.b = T2.b

j*****n
发帖数: 1781
15
here is the reason...
一步:
query on T1, T2 得到下面要查询的一些表的名字

【在 n********6 的大作中提到】
: Why do you suggest dynamic sql?
: Why not make it simple and avoid using dynamic sql?

B*****g
发帖数: 34098
16
俺门连column name都可能要查。

【在 j*****n 的大作中提到】
: here is the reason...
: 一步:
: query on T1, T2 得到下面要查询的一些表的名字

B*****g
发帖数: 34098
17
我竟然也看懂了, 真是宝刀不老

【在 s******n 的大作中提到】
: 我写了下面的一段:
: declare @name nvarchar(30)
: declare @no int
: declare curse insensitive cursor for select tabname from tabs
: open curse
: fetch next from curse into @name
: while @@fetch_status = 0
: begin
: declare sub_curse insensitive cursor for
: select no from tab T1 join @name T2 on T1.a = T2.a and T1.b = T2.b

n********6
发帖数: 1511
18
Note: Following logic do not have dynamic sql.
Advantage: Do not need to learn dynamic sql. Save time. You already know how to use cursor. Just use cursor to solve the problem.
Disadvantage: Loose the opportunity to learn dynamic sql.
第一步:
query on T1, T2 得到下面要查询的一些表的名字
对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
把这些记录中放到自己建的一个表 T
SELECT ...
INTO ##TABLENAME -- Put all the tablesnames into a temptable.
FROM T1 JOIN T2 ON ...
WHERE ...
j*****n
发帖数: 1781
19
你跟LZ 范的错误是同样地...

how to use cursor. Just use cursor to solve the problem.

【在 n********6 的大作中提到】
: Note: Following logic do not have dynamic sql.
: Advantage: Do not need to learn dynamic sql. Save time. You already know how to use cursor. Just use cursor to solve the problem.
: Disadvantage: Loose the opportunity to learn dynamic sql.
: 第一步:
: query on T1, T2 得到下面要查询的一些表的名字
: 对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
: 把这些记录中放到自己建的一个表 T
: SELECT ...
: INTO ##TABLENAME -- Put all the tablesnames into a temptable.
: FROM T1 JOIN T2 ON ...

j*****n
发帖数: 1781
20
an example:
declar @sqlstr nvarchar(4000)
declar @tableName nvarchar(20)
set @tableName = 'theTable'
select @sqlstr = 'SELECT * FROM ' + @tableName
sp_execsql @sqlstr
相关主题
这个query对么?[Mysql] how to return NULL count in group by query (转载)
请教teradata问题cursor可以往回找否??
Job openings with Teradata (zt)问个数据库问题
进入Database版参与讨论
w*r
发帖数: 2421
21
create a temp table to store the intermediate result and use the content of
table to direct the update strategy. store proc is the natural choice,
however on Teradata, store proc is SLOW

【在 j*****n 的大作中提到】
: an example:
: declar @sqlstr nvarchar(4000)
: declar @tableName nvarchar(20)
: set @tableName = 'theTable'
: select @sqlstr = 'SELECT * FROM ' + @tableName
: sp_execsql @sqlstr

B*****g
发帖数: 34098
22
所以只有sql sever developer,没有 teradata developer

of

【在 w*r 的大作中提到】
: create a temp table to store the intermediate result and use the content of
: table to direct the update strategy. store proc is the natural choice,
: however on Teradata, store proc is SLOW

s******n
发帖数: 34
23
谢谢大家啊, 我就不一一谢过了。
我在埋头苦学中, 所以没来看。
终于用dynamic sql 把我要实现的东西实现出来了, 谢谢大家的指点。
不过我现在也开始面临performance问题了。 这些query执行的频率还是挺高的, 而且我
实际需要的还比我写在这里的要复杂不少。
这个stored proc相当慢?

of

【在 w*r 的大作中提到】
: create a temp table to store the intermediate result and use the content of
: table to direct the update strategy. store proc is the natural choice,
: however on Teradata, store proc is SLOW

s******n
发帖数: 34
24
谢谢你写得这么详细。
我也用到了temp table, 跟你这个思路差不多
但是我实际的query还是比这个要复杂不少, 所以我还是用了几个stored proc.

how to use cursor. Just use cursor to solve the problem.

【在 n********6 的大作中提到】
: Note: Following logic do not have dynamic sql.
: Advantage: Do not need to learn dynamic sql. Save time. You already know how to use cursor. Just use cursor to solve the problem.
: Disadvantage: Loose the opportunity to learn dynamic sql.
: 第一步:
: query on T1, T2 得到下面要查询的一些表的名字
: 对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
: 把这些记录中放到自己建的一个表 T
: SELECT ...
: INTO ##TABLENAME -- Put all the tablesnames into a temptable.
: FROM T1 JOIN T2 ON ...

w*******e
发帖数: 1622
25
要是执行频率很高, dynamic sql不是好的选择,
不过在SQL 2005里有个statement level的option(recompile), 你可以试试

且我

【在 s******n 的大作中提到】
: 谢谢大家啊, 我就不一一谢过了。
: 我在埋头苦学中, 所以没来看。
: 终于用dynamic sql 把我要实现的东西实现出来了, 谢谢大家的指点。
: 不过我现在也开始面临performance问题了。 这些query执行的频率还是挺高的, 而且我
: 实际需要的还比我写在这里的要复杂不少。
: 这个stored proc相当慢?
:
: of

1 (共1页)
进入Database版参与讨论
相关主题
cursor可以往回找否??老印给我的一个Challenge
问个数据库问题怎么求和
ask for help with a simple query!!!怎么reference temp table的column
how to make this query请教一个query in mysql
Late afternoon 腦不好使请教一个小白Query 问题
菜鸟急问ORACLE里FUNCTION返回ref cursor的问题请教oracle sql query question
SQL query 一问问个问题
Need help on finding dependency objects这个query对么?
相关话题的讨论汇总
话题: sql话题: query话题: curse话题: cursor话题: 数据库