【求助】SQL Server 表链接查询问题

灵雨飘零 2014-09-17 10:33:32
遇到这样一个问题,不知道如何写SQL语句。
表结构如下。
部门编码、部门名称、部门人员ID(中间用逗号分割)


我想通过和人员表链接,查询出一个新的数据集,查询出的结果集格式如下:
人员信息(ID或者姓名)、部门编码、部门名称


就是想把人员从字段中转换成多行显示,这样的SQL语句如何写呢??


...全文
338 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
baoyawzw 2014-09-24
  • 打赏
  • 举报
回复
我写了个分享下 是直接转化为xml,在解析,简单粗暴

DECLARE @xml NVARCHAR(max),@docHandle int;

SET @xml=N'<root>';

;WITH T(DEPT_CODE,content,A0188s)
AS 
(
	SELECT 1000,'总务系','350,688,258'
	UNION ALL 
	SELECT 1001,'总经理室','2,3,4,298'
	UNION ALL 
	SELECT 1002,'人事科','231,232,233,192,225,228,304,253,254,255,256,257,331,318,321'
	UNION ALL 
	SELECT 1003,'财务科','39,40,41,42,366,684,710'
	UNION ALL 
	SELECT 1004000,'制造二班','159,161,168,169,206,273,314,335,290,164'
	UNION ALL 
	SELECT 1004003,'喷漆班','148,362,140,675'
	UNION ALL 
	SELECT 1004005,'制造一班','160,162,205,218'
	UNION ALL 
	SELECT 1004006,'钳工班','146,147,149,182'
	UNION ALL 
	SELECT 1004007,'库管系','139,113,120,134'
	UNION ALL 
	SELECT 1004008,'电装班','135,130,131'
	UNION ALL 
	SELECT 1005,'信息科','272,89'
	UNION ALL 
	SELECT 1006,'营业部','692,693,95,96'
	UNION ALL 
	SELECT 1006000,'营业一系','275,93,705'
	UNION ALL 
	SELECT 1006003,'营业二系','97,98'
	UNION ALL 
	SELECT 1007,'技术部','5,78,56'
) 
SELECT @xml=@xml+
'<main Dep="'+CAST(DEPT_CODE as NVARCHAR(10))+'"'+N' '+
				'Con="'+CAST(content AS NVARCHAR(10))+'">'+
		 '<row NeiMa="'+REPLACE(A0188s,',','"/> <row NeiMa="')+'"/> 
 </main>
' 
FROM T
SET @xml=@xml+N'</root>'
print @xml

	IF @Xml<>''
	BEGIN
		EXEC sp_xml_preparedocument @docHandle OUTPUT,@xml;
				SELECT *
				FROM OPENXML(@docHandle,'/root/main/row',2)
				WITH 
				(
					 Dep INT         '../@Dep'
					,Con NVARCHAR(50)  '../@Con'
					,NeiMa NVARCHAR(10)    '@NeiMa'
				)
		EXEC sp_xml_removedocument @docHandle 
	END 
	

灵雨飘零 2014-09-17
  • 打赏
  • 举报
回复
引用 3 楼 xxfvba 的回复:
select Dept_Code,Content, SUBSTRING(A0188s,number,charindex(',',A0188s+',',number)-number) from T a,master..spt_values b where number>=1 and number<=LEN(A0188s) and type='P' and SUBSTRING(','+A0188s,number,1)=','
这种写法确实以前没用过,
Tiger_Zhao 2014-09-17
  • 打赏
  • 举报
回复
一字段多值的数据当然不规则了
WITH tableold(DEPT_CODE,content,A0188s) AS (
SELECT '1000',N'总务系','350,688,258' UNION ALL
SELECT '1001',N'总经理室','2,3,4,298'
),
split (DEPT_CODE,i,istart,iend) AS (
SELECT DEPT_CODE,
1,
1,
CHARINDEX(',',A0188s,1)
FROM tableold
UNION ALL
SELECT o.DEPT_CODE,
s.i+1,
s.iend+1,
CHARINDEX(',',o.A0188s,s.iend+1)
FROM split s
JOIN tableold o
ON o.DEPT_CODE = s.DEPT_CODE
WHERE s.iend <> 0
)
SELECT o.DEPT_CODE,
o.content,
Convert(int,
SUBSTRING(o.A0188s,
s.istart,
CASE WHEN s.iend = 0 THEN
len(o.A0188s)+1
ELSE
s.iend
END - s.istart
)
) UserID
INTO #tableNew
FROM split s
JOIN tableold o
ON o.DEPT_CODE = s.DEPT_CODE
ORDER BY DEPT_CODE,UserID

SELECT * FROM #tableNew

DEPT_CODE content      UserID
--------- -------- -----------
1000 总务系 258
1000 总务系 350
1000 总务系 688
1001 总经理室 2
1001 总经理室 3
1001 总经理室 4
1001 总经理室 298
KeepSayingNo 2014-09-17
  • 打赏
  • 举报
回复
先把下面的函数脚本刷下

CREATE FUNCTION [dbo].[Split]   
(   
@c VARCHAR(MAX) ,   
@split VARCHAR(50)   
)   
RETURNS @t TABLE ( col VARCHAR(50) )   
AS  
BEGIN  
    WHILE ( CHARINDEX(@split, @c) <> 0 )   
        BEGIN  
            INSERT  @t( col )   
            VALUES  ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) )   
            SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')   
        END  
    INSERT  @t( col ) VALUES  ( @c )   
    RETURN  
END
KeepSayingNo 2014-09-17
  • 打赏
  • 举报
回复

	IF object_id('tempdb..#TEMPTB1') is not null
	BEGIN
		drop table #TEMPTB1
	END
	CREATE table #TEMPTB1
	(
	    [DEPT_CODE] [int] NULL,
	    [content] [nvarchar](50) NULL,
	    [A0188s] [nvarchar](max) NULL
	)
	
	IF object_id('tempdb..#TEMPTB2') is not null
	BEGIN
		drop table #TEMPTB2
	END
	CREATE table #TEMPTB2
	(
	    [pid] [nvarchar](max) NULL
	)

declare @DEPT_CODE int
declare @content varchar(50)
declare @A0188s varchar(max)
exec('declare my_cursor1 cursor for select * from [Table_Dept]')
open my_cursor1
declare @id1 sysname
declare @id2 sysname
declare @id3 sysname
fetch next from my_cursor1 into @id1,@id2,@id3
	while(@@fetch_status= 0)
		begin	
			set @DEPT_CODE =convert(int,@id1)
			set @content =convert(varchar(50),@id2)
			set @A0188s =convert(varchar(max),@id3)
			truncate table #TEMPTB2
		     insert into #TEMPTB2 select * from Split(@A0188s,',')
		     insert into #TEMPTB1 select @DEPT_CODE,@content,pid from #TEMPTB2
			fetch next from my_cursor1 into @id1,@id2,@id3
		end
close my_cursor1
deallocate my_cursor1

select * from #TEMPTB1
灵雨飘零 2014-09-17
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
数据没有经过预处理,要拆分部门人员ID。 只有规则的数据才能发挥数据库的优势啊!
这样的数据不规则吗??
灵雨飘零 2014-09-17
  • 打赏
  • 举报
回复
引用 2 楼 dotnetstudio 的回复:
弄一个split函数,然后对部门人员ID进行拆分,最后再将这个查询结果和人员表进行关联
可否给个实例语句。
Tiger_Zhao 2014-09-17
  • 打赏
  • 举报
回复
数据没有经过预处理,要拆分部门人员ID。
只有规则的数据才能发挥数据库的优势啊!
xxfvba 2014-09-17
  • 打赏
  • 举报
回复
select Dept_Code,Content, SUBSTRING(A0188s,number,charindex(',',A0188s+',',number)-number) from T a,master..spt_values b where number>=1 and number<=LEN(A0188s) and type='P' and SUBSTRING(','+A0188s,number,1)=','
KeepSayingNo 2014-09-17
  • 打赏
  • 举报
回复
弄一个split函数,然后对部门人员ID进行拆分,最后再将这个查询结果和人员表进行关联
灵雨飘零 2014-09-17
  • 打赏
  • 举报
回复
自己占沙发!!
xiaodongni 2014-09-17
  • 打赏
  • 举报
回复

--给你个列子上次面试就碰到这题目了
--测试数据
create table test2(number int)
insert into test2 values 
(1),(2),(3),(4),(5),(7),(8),
(10),(11),(13),(15)

--这是我总结的方法
declare @str varchar(8000)
select @str=' select '+REPLACE(''+number+'',',',' number union all select ') from  test1
exec(@str)
--这个效率虽然不高。但是思想很新颖。
with b as (select ROW_NUMBER()over(order by id) rn from sysobjects )  
select SUBSTRING(a.number,b.rn * 2 - 1 ,1)
from test1 a, b
where rn <= 6  
--这个想法很好。不过这个只能满足本题。如果分隔的数字只能是个位数。如果有10就不行了。
SELECT t.c.value('.','int')       
FROM(
SELECT CONVERT(XML,'<x>'+replace(number,',','</x><x>')+'</x>') AS B
    from #test1) a 
CROSS APPLY a.B.nodes('/x') T(c)  

select --t.number,
       SUBSTRING(t.number, s.number ,CHARINDEX(',',t.number+',',s.number)-s.number) as number
from test1 t,master..spt_values s
where s.number >=1
and s.type = 'P'
and SUBSTRING(','+t.number,s.number,1) = ','
--这上面2个方法都很好。第一种还没看懂。先发出来。XML不是很懂。等等再去查查。
原帖地址 你可以看看 http://bbs.csdn.net/topics/390884161?page=2
vf6.0,要考二级没系统的下哈 Microsoft Visual FoxPro 6.0 for Windows 的常见问题 这些是有关 Microsoft Visual FoxPro 最常见的问题。在您求助 Microsoft 产品支持服务之前,请先查阅这张列。 若想打印这些附注,请从“文件”菜单中选择“打印”命令。此文档分为以下四部分: --------------------------------------------------------------------- 部分 1. 技术支持与市场 部分 2. Visual FoxPro 6.0 新增功能 部分 3. 从其他版本的 FoxPro 和 Visual FoxPro 中移植 部分 4. Visual FoxPro 常见问题 --------------------------------------------------------------------- 部分 1. 技术支持与市场 问题 1-1: 从何处可以获得产品的更新版本? 答案: 在 Visual FoxPro 的 Web 站点上即可获得产品的更新信息,其中包括有关 Service Pack 和更新的示例、向导及其他代码的信息,该站点的网址为: www.microsoft.com/vfoxpro 请定期查看该网站,以便下载产品的最新版本。 问题 1-2: 从何处可以得到有关 Visual FoxPro 的详细资料? 答案: 通过 Microsoft Visual FoxPro Web 站点是随时获得各种最新产品发布信息的最佳途径。在此站点上不仅有新的产品公告,而且还提供了产品的更新信息、技术文章、白皮书、专业开发人员设计的优秀示例、会议公告、以及与其他许多 FoxPro web 站点的各种链接问题 1-3: 如何获得技术支持,以及如何报告软件错误? 答案: Microsoft Visual FoxPro Web 站点已经链接到了多种联机支持选项,其中包括覆盖面广阔的有关所有产品 Microsoft Knowledge Base(Microsoft 知识库)。您还可以阅读一份有关常见问题的清单。除联机支持之外,还可以直接通过电话获得技术支持。“帮助”菜单中的选项可列出技术支持的电话号码。这些电话号码也可用于报告产品中的错误。 问题 1-4. 什么是 Knowledge Base?如何使用它? 答案: Knowledge Base 是内容广泛的论文集,覆盖了如何使用产品的各种特性、已知的软件错误及其解决方案或回避的方法、以及其他有助于使用各种 Microsoft 产品的有用信息。通过以下站点可访问整个 Knowledge Base: support.microsoft.com 问题 1-5: 是否会有 Visual FoxPro 6.0a? 答案: Microsoft 公司一向承诺为用户提供高质量的产品。如果确实需要,我们将提供 Visual FoxPro 6.0 的错误修订版。但是,修订版不会使用 6.0a 版的形式。Visual FoxPro 6.0 中任何错误的修正都将包含在 Visual Studio Service Pack 中。同时还会在 Visual FoxPro 的 www.microsoft.com/vfoxpro 或 Visual Studio 的www.microsoft.com/vstudio 的 Web 站点上发布修订公告。 问题 1-6: Microsoft 公司为应用程序的开发提供了一些优秀的解决方案。怎样才能知道应该向客户推荐和使用哪种产品? 答案: 在选择适用某项任务的产品时,需要考虑多方面的因素。Microsoft Visual FoxPro web 站点上有一份优秀的策略背景论文,它比较了 Visual FoxPro、Visual Basic、SQL Server 和 Access 等 Microsoft 产品之间的不同。 问题 1-7: 哪里可以找到 Visual FoxPro 的使用示例? 答案: Visual FoxPro 6.0 产品中带有丰富的示例,其中有一些是针对 6.0 版特有功能的新示例。与 Visual FoxPro 以前的版本不同,这些示例将与所有 Visual Studio 示例安装在一起。您必须运行 MSDN Library 的“自定义”安装来安装这些示例。在 Visual FoxPro 中可使用新的 HOME(2) 函数方便地找到已安装示例的位置。 除了产品中所自带的示例外,Microsoft Visual FoxPro web 站点还将经常提供新的示例。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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