求最高效的sql语句写法。

Keyln 2003-10-10 11:03:58
Id groupid user
1 1 阿明
2 1 阿江
3 2 阿水
4 2 阿狂
………………….
………………….

Id groupname
1 教务处
2 总务处
……………..
………………
如果收件人为﹕教务处﹑阿水 。那幺发送后﹐因为阿明﹑阿江都为教务处﹐所以说阿明﹑阿江﹑阿水都会收到文件。这句sql语句最好怎幺写。即实际把收件人转换成=阿明﹑阿江﹑阿水
...全文
34 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
txlicenhe 2003-10-10
  • 打赏
  • 举报
回复
若组别不只一个,如下调用:
declare @str varchar(100),@id int,@groupn varchar(10)
set @str = '教务处、阿水、总务处'
declare cur cursor for
Select [id], groupname from 表2 where charindex(groupname,@str) > 0
open cur
fetch next from cur into @id,@groupn
while @@fetch_status = 0 and @@rowcount>0
begin
set @str = replace(@str,@groupn,dbo.fmerg(@id))
fetch next from cur into @id,@groupn
end
close cur
deallocate cur
select @str

----------------------------------------------------------------------------------------------------
阿明、阿江、阿水、阿水、阿狂

(所影响的行数为 1 行)

123456754321 2003-10-10
  • 打赏
  • 举报
回复
CHARINDEX
返回字符串中指定表达式的起始位置。

语法
CHARINDEX ( expression1 , expression2 [ , start_location ] )

参数
expression1

一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。

expression2

一个表达式,通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。

start_location

在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是一个负数或零,则将从 expression2 的起始位置开始搜索。

返回类型
int
REPLACE
用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。

语法
REPLACE ( 'string_expression1' , 'string_expression2' , 'string_expression3' )

参数
'string_expression1'

待搜索的字符串表达式。string_expression1 可以是字符数据或二进制数据。

'string_expression2'

待查找的字符串表达式。string_expression2 可以是字符数据或二进制数据。

'string_expression3'

替换用的字符串表达式。string_expression3 可以是字符数据或二进制数据。

返回类型
如果 string_expression(1、2 或 3)是支持的字符数据类型之一,则返回字符数据。如果 string_expression(1、2 或 3)是支持的 binary 数据类型之一,则返回二进制数据。

Keyln 2003-10-10
  • 打赏
  • 举报
回复
这里人好好﹐现在结分呀。
zjcxc 2003-10-10
  • 打赏
  • 举报
回复
--创建数据测试环境
create table 表A(id int,groupid int,[user] varchar(10))
insert 表A
Select 1,1,'阿明'
Union all select 2,1,'阿江'
Union all select 3,2,'阿水'
Union all select 4,2,'阿狂'

create table 表B (id int,groupname varchar(10))
insert 表B select 1,'教务处'
Union all select 2,'总务处'

--调用自定义函数得到结果,名称之间用空格分隔
select a.groupid,dbo.f_merg(a.groupid,' ') from 表A a
join 表B b on a.groupid = b.id
where b.groupname in('教务处')
group by a.groupid

newdongkui 2003-10-10
  • 打赏
  • 举报
回复
马可试试这个

教务处、阿水、保卫处
zjcxc 2003-10-10
  • 打赏
  • 举报
回复
最高效率,用自定义函数,

--创建一个合并的函数,@gid为组号,@spcchr为姓名之间的分隔符
create function f_merg(@gid int,@spcchr varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+@spcchr+[user] from 表A where groupid=@gid
set @str=substring(@str,len(@spcchr)+1,8000)
return(@str)
End
go

--调用自定义函数得到结果,名称之间用空格分隔
select groupid,dbo.f_merg(groupid,' ') from 表A group by groupid
txlicenhe 2003-10-10
  • 打赏
  • 举报
回复
后一种不是已经实现了吗?
Keyln 2003-10-10
  • 打赏
  • 举报
回复
select distinct a.groupid,dbo.fmerg(a.groupid) from 表A a
join 表B b on a.groupid = b.id where b.groupname in('教务处'﹑'阿水')
不行呀。。
我的目的是把”教务处﹑阿水”转换成”阿明﹑阿江﹑阿水”而这种结果只是变成了”阿明﹑阿江”

txlicenhe 2003-10-10
  • 打赏
  • 举报
回复
create table 表1(id int,groupid int,[user] varchar(10))
insert 表1
Select 1,1,'阿明'
Union all select 2,1,'阿江'
Union all select 3,2,'阿水'
Union all select 4,2,'阿狂'

create table 表2 (id int,groupname varchar(10))
insert 表2 select 1,'教务处'
Union all select 2,'总务处'


--1.创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+'、'+[user] from 表1 where groupid=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go


declare @str varchar(100),@id int,@groupn varchar(10)
set @str = '教务处、阿水'
Select @id = [id],@groupn = groupname from 表2 where charindex(groupname,@str) > 0
Select replace(@str,@groupn,dbo.fmerg(@id))


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
阿明、阿江、阿水

(所影响的行数为 1 行)


arrow_gx 2003-10-10
  • 打赏
  • 举报
回复
问题不清楚?你的SQL 要实现什么,要更新什么?要查询什么?收件人是什么概念?如何操作(或操作结果)?表结构?

一点都不明白?只好帮你 UP
aierong 2003-10-10
  • 打赏
  • 举报
回复
来晚来

你自己定义一个合并函数就可以解决问题啦

好运
txlicenhe 2003-10-10
  • 打赏
  • 举报
回复
--1.创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+'、'+[user] from 表A where groupid=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go

--调用自定义函数得到结果
select distinct a.groupid,dbo.fmerg(a.groupid) from 表A a
join 表B b on a.groupid = b.id where b.groupname = '教务处'
txlicenhe 2003-10-10
  • 打赏
  • 举报
回复
--1.创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+'、'+[user] from 表A where groupid=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go

--调用自定义函数得到结果
select distinct id,dbo.fmerg(id) from 表A

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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