这个该怎么写呢

xinyi124 2012-03-12 06:32:17
A表 X字段内容 3,5,7
B表 Num Name
1 abc
2 abc
3 abc
4 abc
5 abc
6 abc
7 abc
8 abc

inner join 查询时候 能获取到 3,5,7对应的Name值

或者要怎么解决。。先谢谢了
...全文
76 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr_Nice 2012-03-12
  • 打赏
  • 举报
回复
if object_id('[TB_B]') is not null drop table [TB_B]
go
create table [TB_B] (Num int,Name nvarchar(6))
insert into [TB_B]
select 1,'abc' union all
select 2,'abc' union all
select 3,'abc' union all
select 4,'abc' union all
select 5,'abc' union all
select 6,'abc' union all
select 7,'abc' union all
select 8,'abc'

select * from [TB_B]


declare @i varchar(30)
set @i='3,5,7'

exec('select * from TB_B where Num like ''['+@i+']'+'''')


如果仅仅是单独的数值的话.
xinyi124 2012-03-12
  • 打赏
  • 举报
回复
感谢各路大神。。受教了
Felixzhaowenzhong 2012-03-12
  • 打赏
  • 举报
回复

CREATE FUNCTION [dbo].[fn_get_Split]
(
@SplitString varchar(4000),
@Separator varchar(2) = ','
)
RETURNS @SplitStringsTable TABLE
(
[id] int identity(1,1),
[value] varchar(8000)
)
AS
BEGIN
DECLARE @CurrentIndex int
DECLARE @NextIndex int
DECLARE @ReturnText varchar(8000)
SELECT @CurrentIndex=1
WHILE(@CurrentIndex<=datalength(@SplitString))
BEGIN
SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex)
IF(@NextIndex=0 OR @NextIndex IS NULL)
SELECT @NextIndex=datalength(@SplitString)+1

SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex)

INSERT INTO @SplitStringsTable([value])
VALUES(@ReturnText)

SELECT @CurrentIndex=@NextIndex+1
END
RETURN
END


----
declare @str varchar(32)
set @str= '3,5,7'
/*如果取多条的话,用循环从你的A表中取值传给参数调用 表值函数就可以了*/


create table tabs (num int,name varchar(32))
insert into tabs select 1,'abc' union all
select 2,'abc'union all
select 3,'abc'union all
select 4,'abc'union all
select 5,'abc'union all
select 6 ,'abc'union all
select 7,'abc'union all
select 8,'abc'


select b.* from tabs as b,(select * from fn_get_Split(@str,',')) as a where b.num=a.value
/*
num name
3 abc
5 abc
7 abc
*/


--drop table tabs
--drop function fn_get_Split
  • 打赏
  • 举报
回复

go
if object_id('[A1]') is not null
drop table [A1]
go
create table [A1](
[ID] varchar(1),
[X] varchar(5)
)
go
insert [A1]
select '1','3,5,7'
--> 测试数据:[B2]
go
if object_id('[B2]') is not null
drop table [B2]
go
create table [B2](
[Num] varchar(2),
[Name] varchar(3)
)
go
insert [B2]
select '1','abc' union all
select '2','abc' union all
select '3','abc' union all
select '4','abc' union all
select '5','abc' union all
select '6','abc' union all
select '7','abc' union all
select '8','abc'

go
create function f_hb(@id varchar(10))
returns varchar(1000)
as
begin
declare @str varchar(1000)
set @str=''
select @str=@str+','+[Name] from [B2]
where charindex(','+cast([Num] as varchar)+',',','+@id+',')>0
return stuff(@str,1,1,'')
end


go
select classid=dbo.f_hb([X]) from [A1]

/*
classid
abc,abc,abc
*/

  • 打赏
  • 举报
回复

分解字符串包含的信息值后然后合并到另外一表的信息
(爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-12-23 广东深圳)

/*问题描述
tba
ID classid name
1 1,2,3 西服
2 2,3 中山装
3 1,3 名裤
tbb
id classname
1 衣服
2 上衣
3 裤子

我得的结果是
id classname name
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
*/

-----------------------------------------------------
--sql server 2000中的写法
create table tba(ID int,classid varchar(20),name varchar(10))
insert into tba values(1,'1,2,3','西服')
insert into tba values(2,'2,3' ,'中山装')
insert into tba values(3,'1,3' ,'名裤')
create table tbb(ID varchar(10), classname varchar(10))
insert into tbb values('1','衣服')
insert into tbb values('2','上衣')
insert into tbb values('3','裤子')
go

--第1种方法,创建函数来显示
create function f_hb(@id varchar(10))
returns varchar(1000)
as
begin
declare @str varchar(1000)
set @str=''
select @str=@str+','+[classname] from tbb where charindex(','+cast(id as varchar)+',',','+@id+',')>0
return stuff(@str,1,1,'')
end
go
select id,classid=dbo.f_hb(classid),name from tba
drop function f_hb
/*
id classid name
----------- ------------- ----------
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
(所影响的行数为 3 行)
*/

--第2种方法.update
while(exists (select * from tba,tbb where charindex(tbb.id,tba.classid) >0))
update tba
set classid= replace(classid,tbb.id,tbb.classname)
from tbb
where charindex(tbb.id,tba.classid)>0
select * from tba
/*
ID classid name
----------- -------------------- ----------
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
(所影响的行数为 3 行)
*/
drop table tba,tbb

------------------------------------------------------------------------
--sql server 2005中先分解tba中的classid,然后再合并classname
create table tba(ID int,classid varchar(20),name varchar(10))
insert into tba values(1,'1,2,3','西服')
insert into tba values(2,'2,3' ,'中山装')
insert into tba values(3,'1,3' ,'名裤')
create table tbb(ID varchar(10), classname varchar(10))
insert into tbb values('1','衣服')
insert into tbb values('2','上衣')
insert into tbb values('3','裤子')
go

SELECT id , classname , name FROM
(
SELECT DISTINCT id , name FROM (select tbc.id , tbc.name , tbb.classname from
(
SELECT A.id , A.name , B.classid FROM(SELECT id , name , [classid] = CONVERT(xml,'<root><v>' + REPLACE([classid], ',', '</v><v>') + '</v></root>') FROM tba)A
OUTER APPLY(SELECT classid = N.v.value('.', 'varchar(100)') FROM A.[classid].nodes('/root/v') N(v))B
) tbc , tbb where tbc.classid = tbb.id
) T
)A
OUTER APPLY
(
SELECT [classname]= STUFF(REPLACE(REPLACE((
SELECT classname FROM (select tbc.id , tbc.name , tbb.classname from
(
SELECT A.id , A.name , B.classid FROM(SELECT id , name , [classid] = CONVERT(xml,'<root><v>' + REPLACE([classid], ',', '</v><v>') + '</v></root>') FROM tba)A
OUTER APPLY(SELECT classid = N.v.value('.', 'varchar(100)') FROM A.[classid].nodes('/root/v') N(v))B
) tbc , tbb where tbc.classid = tbb.id
) N
WHERE id = A.id and name = A.name
FOR XML AUTO), '<N classname="', ','), '"/>', ''), 1, 1, '')
)N
order by id

drop table tba,tbb

/*
id classname name
----------- -------------- ----------
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
(3 行受影响)
*/


自己修改一下吧

唐诗哥哥回家吃饭去了
xinyi124 2012-03-12
  • 打赏
  • 举报
回复
要怎么写额 - -
Felixzhaowenzhong 2012-03-12
  • 打赏
  • 举报
回复
写个表值函数,如何和 B表做 管理即可
xinyi124 2012-03-12
  • 打赏
  • 举报
回复
谁来帮帮忙。。。。
xinyi124 2012-03-12
  • 打赏
  • 举报
回复
我希望得到的结果是 abc,abc,abc..
唐诗三百首 2012-03-12
  • 打赏
  • 举报
回复

select b.Num,b.Name
from A表 a
inner join B表 b
on a.X=b.Num
不需要开发,0行代码接口服务,sql编程,只要会sql就会接口服务,让后端变得更简单,简单4步短短5分钟,立马上手,java小白也可以接口。订阅课程后可以免费获取发布版进行使用和测试。 0行代码服务的需要来源案例一,当时有个项目,有400张表,都是管理系统,单表维护的内容较多,当时的项目团队是13人,前后端都,那时候还没有springboot,用的是ssm,mybatis刚出来,有了替代hibernate的趋势,ifelse了一堆又一堆,实体类也是,当时的后端分了7层☒,天天加班干这活,复制粘贴,很容易犯错,实体类多人引用修改,真的是废了很大的劲……案例二,也是一个比较大的项目,两千万多万那种,当时为了拿项目,需要快速实现原型给客户看,要求比较高,虽说是原型但是数据全部需要实时,这时候就需要大量编数据接口,同样编接口这件事难度倒是不大,但是量大,编过程手很容易出错……案例三,以前管理的团队主要做移动端开发,里面的项目会涉及到推送,管理系统,数据采集与同步,总之很多内容,需要前后端通吃,我不仅需要出方案,设计原型,设计数据库,出报价,沟通需求,还要后端框架,数据接口与数据采集,开发前端(web端),移动端,管理所有项目,但是那时候招的人只会移动端,实在是忙不过来,我就想能不能有个框架让不会java的人能接口,因为移动端sqlite总是会用的,也就是说sql不是难点……基于以上三点需求的积累,我利用业余时间了一个后端框架,完成了这样的需求,刚开始是需要三行代码完成一个接口,经过后面优化,现在不代码也可以实现……  本框架涉及的知识点比较多,目前提供最基础版供大家学习和使用,后期逐步推出框架具体的教程和功能内容,下期我们讲如何在实际项目中通过部署版如何完成所需要的接口编,欢迎大家订阅。

22,209

社区成员

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

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