这个还没有解决问题啊
@Albert Fei: 两个表的联合查询很简单的吧,把1|2用上面的函数分割下就好了
@happydaily: 对于我来说当然不是问题,但你只给split函数,对于提问者可能还搞不定这个问题。
当然能给出全部代码比较好了。
@Albert Fei: 你真是好人。
学习
为了表达你问问题的诚意,建议最好把示例数据的sql写好,否则浪费我们的时间
这个表设计的不是很好,还是用字符串来做表间多对多的关系.
建议修改表设计,这涉及到tsql中的字符串聚合算法,最适合用for xml path
以下是我的代码,使用cte完成,如果不满足你的要求,你可以把cte改成表表达式.
with cte_company (id,companyName,industryIds) as ( select 1,'公司A','1|2' union all select 2,'公司B','2|3' ) ,cte_industry(id,industryName) as ( select 1,'计算机行业' union all select 2,'通信行业' union all select 3,'电子行业' ) ,cte_temp (id,companyname,industryname) as ( SELECT C.id, C.companyName,I.industryName FROM cte_company AS C JOIN cte_industry AS I ON CHARINDEX('|'+cast(i.id as varchar) +'|','|'+C.industryIds+'|')>0 ) SELECT * FROM ( select companyName from cte_temp GROUP BY companyname ) AS A OUTER APPLY ( SELECT V= stuff( (SELECT ',' + T.industryname from cte_temp AS T WHERE A.companyname = T.companyname for XML path('') ),1,1,'') )B
你的
with cte_company (id,companyName,industryIds)
as (
select 1,'公司A','1|2' union all select 2,'公司B','2|3'
)
,cte_industry(id,industryName)
as (
select 1,'计算机行业' union all select 2,'通信行业' union all select 3,'电子行业'
)
首先:可以直接从公司信息表,行业信息表 这二个表里查的啊。提问者只是给出一些demo数据。
其次:肯定不止这么几条数据的。
支持你的建议:建议修改表设计,这涉及到tsql中的字符串聚合算法,最适合用for xml path
@Albert Fei:
前面我为什么写成CTE,因为我没有创建表啊,所以我写成CTE,或者使用values虚表。
谢谢
这个只需要写一个字符分割函数就行。
哥们写了个全部代码如下:
create function fn_split(@strings nvarchar(4000),@splitChar nvarchar(100))
returns @splitTbl table (col nvarchar(1000))
as
begin
declare @CI int;
declare @splitItem nvarchar(1000);
set @CI=charIndex(@splitChar,@strings);
while @CI>0
begin
set @splitItem=substring(@strings, 1, @CI-1);
set @strings=substring(@strings, @CI+len(@splitChar),len(@strings)-@CI);
set @CI=charIndex(@splitChar,@strings);
insert @splitTbl select @splitItem;
end
insert @splitTbl select @strings;
return;
end
create function [dbo].[FN_GETCCNames](@IDs NVARCHAR(10))
RETURNS VARCHAR(4000)
AS
BEGIN
DECLARE @VALUES NVARCHAR(4000);
SET @VALUES='';
SELECT @VALUES=@VALUES+','+ CONVERT(NVARCHAR,industryName)
FROM industry I
inner join fn_split(@IDs,'|') f on f.col=I.id
RETURN STUFF(@VALUES,1,1,'');
END;
select id,companyName,[dbo].[FN_GETCCNames](industryIds) as industryNames
from company;
此处说明一下:公司信息表对应我的company表 行业信息表对应我的industry表