这样的查询实在是太慢了,大家给点意见

gogocsgogodn 2007-11-29 04:33:28
大致要求是这样的 一个列表 但是列表中有个字段是多个字符串拼接的
例如:
项目编号 项目名称 中标人 (一个项目有多个标段,意味着有多个中标人,用"/"隔开)
001 测试1 天天/常常/饿额

我写了个视图

SELECT PROJ_NO,PROJ_NAME,
(SELECT DISTINCT strCat(P.PROJID) FROM IBS_T_BID_NODE_HITBIDRESU) AS NOTICE_NO,
FROM PROJ_INFO ( 此处省略了一些其它表字段和连接)

strCat函数是这样写的

CREATE OR REPLACE FUNCTION "STRCAT" ( str_in in varchar2 )--分类字段
return varchar2
is
str_list varchar2(4000) default null;--连接后字符串
str varchar2(20) default null;--连接符号
begin
for x in ( select NOTICE_NO from IBS_T_BID_NODE_HITBIDRESU where PROJID = str_in ) loop
str_list := str_list || str || to_char(x.NOTICE_NO);
str := '/';
end loop;
return str_list;
end;

现在的情况是 注释掉NOTICE_NO字段 几秒种就出来列表,加上要等5多分钟,我看下IBS_T_BID_NODE_HITBIDRESU 有大概3000条记录 列表有130记录 意味着NOTICE_NO字段加上 要做 130*3000操作 可能就是因为这慢

能有其它办法让列表出来快点吗?
希望大家给点意见 谢谢!
...全文
140 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gogocsgogodn 2007-11-29
  • 打赏
  • 举报
回复
谢谢 潇洒
不过和我说的好象有点不一样啊
gogocsgogodn 2007-11-29
  • 打赏
  • 举报
回复
恩 是oracle的
dawugui 2007-11-29
  • 打赏
  • 举报
回复
楼主的代码中有 varchar2,是oracle的.
dawugui 2007-11-29
  • 打赏
  • 举报
回复
create table tb(项目编号 varchar(10),项目名称 varchar(10),中标人 varchar(20))
insert into tb values('001', '测试1', '天天/常常/饿额')
go

-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1) INTO tmp FROM syscolumns a, syscolumns b
SELECT A.项目编号,A.项目名称,中标人 = SUBSTRING(A.中标人, B.ID, CHARINDEX('/', A.中标人 + '/', B.ID) - B.ID) FROM tb A, tmp B WHERE SUBSTRING('/' + a.中标人, B.id, 1) = '/' ORDER BY 1,2
GO

drop table tb,tmp

/*
项目编号 项目名称 中标人
---------- ---------- --------------------
001 测试1 天天
001 测试1 常常
001 测试1 饿额

(所影响的行数为 3 行)
*/
playwarcraft 2007-11-29
  • 打赏
  • 举报
回复
看lz的function好像不是ms-sql的? oracle ?
dawugui 2007-11-29
  • 打赏
  • 举报
回复
CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1,'中国;日本;韩国' UNION ALL
SELECT 2,'美国;意大利;法国' UNION ALL
SELECT 3,'德国'
SELECT * FROM A

-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b


SELECT
A.ID,
COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX(';', A.COUNTRY + ';', B.ID) - B.ID)
FROM A, # B
WHERE SUBSTRING(';' + a.COUNTRY, B.id, 1) = ';'
ORDER BY 1,2
GO

DROP TABLE A,#

id country
----------- ----------------
1 中国;日本;韩国
2 美国;意大利;法国
3 德国

(所影响的行数为 3 行)

ID COUNTRY
----------- ---------
1 韩国
1 日本
1 中国
2 法国
2 美国
2 意大利
3 德国

(所影响的行数为 7 行)

gogocsgogodn 2007-11-29
  • 打赏
  • 举报
回复
自己先顶下吧

34,838

社区成员

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

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