首页 新闻 会员 周边

SQL 复杂查询,求指导

0
悬赏园豆:30 [待解决问题]

公司信息表:

id  companyName   industryIds

1   公司A                  1|2

2   公司B                  2|3

 

行业信息表:

id industryName  

1   计算机行业              

2   通信行业      

3   电子行业

 

如何通过一次查询 实现结果

1    公司A   计算机行业 ,通信行业

2    公司B   通信行业,电子行业

请大神指导!!

分享我的世界的主页 分享我的世界 | 初学一级 | 园豆:154
提问于:2013-11-20 16:03
< >
分享
所有回答(5)
0
happydaily | 园豆:301 (菜鸟二级) | 2013-11-20 16:28

这个还没有解决问题啊

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-11-20 17:17

@Albert Fei: 两个表的联合查询很简单的吧,把1|2用上面的函数分割下就好了

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2013-11-20 17:19

@happydaily: 对于我来说当然不是问题,但你只给split函数,对于提问者可能还搞不定这个问题。

当然能给出全部代码比较好了。

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-11-21 13:10

@Albert Fei: 你真是好人。

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2013-11-21 14:47
0

学习

大芝麻 | 园豆:4 (初学一级) | 2013-11-20 16:34
0

为了表达你问问题的诚意,建议最好把示例数据的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

 

tneduts | 园豆:239 (菜鸟二级) | 2013-11-21 08:54

你的

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

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-11-21 13:18

@Albert Fei: 

前面我为什么写成CTE,因为我没有创建表啊,所以我写成CTE,或者使用values虚表。

谢谢

支持(0) 反对(0) tneduts | 园豆:239 (菜鸟二级) | 2013-11-21 13:33
0

这个只需要写一个字符分割函数就行。

幻天芒 | 园豆:37175 (高人七级) | 2013-11-21 13:10
0

哥们写了个全部代码如下:

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

  

Albert Fei | 园豆:2102 (老鸟四级) | 2013-11-21 13:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册