select a.user_id,b.user_space
from MEMBER a,
(select user_id,user_space from mail_box_A
union
select user_id,user_space from mail_box_B
union
......
select user_id,user_space from mail_box_Z) as b
where a.userid = b.userid似乎没有简单方法了 :-(
from MEMBER a,
(select user_id,user_space from mail_box_A
union
select user_id,user_space from mail_box_B
union
......
select user_id,user_space from mail_box_Z) as b
where a.userid = b.userid似乎没有简单方法了 :-(
select userid ,count(*) from mail_box_a group by userid
union
select userid ,count(*) from mail_box_b group by userid
union
select userid ,count(*) from mail_box_c group by userid
union
select userid ,count(*) from mail_box_d group by userid
union
select userid ,count(*) from mail_box_e group by userid ......union
select userid ,count(*) from mail_box_z group by userid
select user_id, sum(mail_size) from mail_box_x group by user_id
MAIL_BOX_X是26个表来的,从MAIL_BOX_A到MAIL_BOX_Z,邮件的存放到哪一个表是根据USER_ID的头一个字母来决定的(例如MAIL_BOX_A里放的邮件信息都是以A为第一个字母的用户)
union
select userid ,count(*) from mail_box_b group by userid
union
select userid ,sum(mail_size) from mail_box_c group by userid
union
select userid ,sum(mail_size) from mail_box_d group by userid
union
select userid ,sum(mail_size) from mail_box_e group by userid ......union
select userid ,sum(mail_size) from mail_box_z group by userid
select USER_ID, sum(MAIL_SIZE) as USED_SPACE from
(select USER_ID, MAIL_SIZE from MAIL_BOX_A
union select USER_ID, MAIL_SIZE from MAIL_BOX_B
......
union select USER_ID, MAIL_SIZE from MAIL_BOX_Z
)
group by USER_ID
2。使用动态SQL执行:
declare @X char(1)
declare @userid char(10)
select USER_ID into userid from MEMBER where ....
set @X = left(userid, 1)
exec("select USER_ID, sum(MAIL_SIZE) as USED_SPACE from MAIL_BOX_"+@X+" where USER_ID = '"+@userid+"'")
declare @s char(1)
set @s='A'
set @exeStr='select a.user_id,b.user_space from mail a, ( '
while @s<='Z'
begin
set @exeStr=@exeStr+'select userid,count(*) from mail_box_'+@s+' group by userid '
set @a=char(ascii(@a)+1)
end
set @exeStr=@exeStr+' ) b'exec (@exeStr) set
end
hjhing(winding) ( )
我试过最简单的(仿照书本上的):
select "TOTALSIZE"=(
SELECT SUM(MAILSIZE) from mailbox_body_k
WHERE USER_ID=a.USER_ID
)
from member a
都报错:
服务器: 消息 446,级别 16,状态 9,行 21
无法解决 equal to 操作的排序规则冲突。
呜呜~~~~~~
老兄又爬到五座山了
是的,用的是SQLServer 2000,有关系的吗?
(user_id varchar(100),user_space float(18) )
insert into #table
select user_id,count(*) from MAIL_BOX_a group by user_id
.
.
.
insert into #table
select user_id,count(*) from MAIL_BOX_X group by user_idselect * from #tabledrop table #table
create table #table
(user_id varchar(100),user_space float(18) )
insert into #table
select user_id,sum(MAIL_SIZE) from MAIL_BOX_a group by user_id
.
.
.
insert into #table
select user_id,sum(MAIL_SIZE) from MAIL_BOX_X group by user_idselect * from #tabledrop table #table
select (
select count(*) from MEMBER b where b.USER_ID = a.USER_ID
) as aaa
from member a
成功返回记录信息select (
select count(*) from mailbox_body_k b where b.USER_ID = a.US
) as aaa
from member a
却出错了,百思不得其解。
服务器: 消息 446,级别 16,状态 9,行 20
无法解决 equal to 操作的排序规则冲突。
一个表都不行,更不用说是26个表了:(
导出建表语句看看!!
CREATE TABLE [dbo].[MEMBER] (
[USER_ID] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[USER_PA] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[USER_EMAIL] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[NICK_NAME] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[GROUP_ID] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[RIGHT] [varchar] (1) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GOCREATE TABLE [dbo].[MAILBOX_BODY_K] (
[USER_ID] [varchar] (50) COLLATE Chinese_PRC_CS_AS NOT NULL ,
[SEND_NAME] [varchar] (50) COLLATE Chinese_PRC_CS_AS NULL ,
[SEND_EMAIL] [varchar] (50) COLLATE Chinese_PRC_CS_AS NULL ,
[SEND_DATA] [varchar] (50) COLLATE Chinese_PRC_CS_AS NULL ,
[SUBJECT] [varchar] (200) COLLATE Chinese_PRC_CS_AS NULL ,
[CONTENT] [text] COLLATE Chinese_PRC_CS_AS NULL ,
[SIZE] [int] NULL ,
[MAILBOX_PATH] [varchar] (50) COLLATE Chinese_PRC_CS_AS NULL ,
[ADDRROOM] [char] (2) COLLATE Chinese_PRC_CS_AS NULL ,
[MOTELY] [varchar] (50) COLLATE Chinese_PRC_CS_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
try below:select (
select count(*) from mailbox_body_k b where b.[USER_ID] = a.[USER_ID] COLLATE Chinese_PRC_CI_AS
) as aaa
from member a
给你提个建议
1.给 member,mailbox_body_k添加主键
2.不要使用SQL SERVER默认的字符串,如:USER_ID,SIZE...
3.MEMBER和mailbox_body_X的关系不明确
select top 100 percent user_id,mail_size from
(
select user_id,mail_size from mail_box_a
union all
select user_id,mail_size from mail_box_b
union all
select user_id,mail_size from mail_box_c
....
) t0
查询时就简单多了。
create proc usp_getmailsize
@user_id varchar(30)
as
BEGIN
declare @rc int,
@firstChar char(2),
@Mailbox_name varchar(30),
@str varchar(2000),
@TEMP varchar(2000)
select @rc=0if @user_id is null
begin
select @rc=-1
return @rc
endselect @firstChar =left(@user_ID,1) where left(@user_ID,1) like '[A-Za-z]'
if @firstChar is null
begin
select @rc=-2
return @rc
endselect @Mailbox_name='mailbox_body'select @str=@Mailbox_name+'_'+@firstChar
--print @str
SET @TEMP= 'select a.[user_id],sum(b.[size]) from member a left outer join '+ @str+' b on a.[user_id]=b.[user_id] COLLATE Chinese_PRC_CI_AS
group by a.[User_id]'
EXEC (@TEMP)
SELECT @RC=@@ERROR
IF @RC<>0
begin
select @rc=-3
return @rc
end
END
go
exec usp_getmailsize 'kest'
这问题困了我整天一会儿给分
这版的人太热情了,特别感谢Chiff(~o~)和leimin(黄山光明顶)。100分不够分,另开了张贴
http://expert.csdn.net/Expert/topic/1171/1171838.xml?temp=.6509516
Chiff(~o~)、leimin(黄山光明顶)进来拿分吧~~