日期:2014-05-17  浏览次数:20714 次

【优化】求助!!!查询数据问题,最好不要用游标
一张表职位表  
字段: 职位,人员 
数据用例:  管理员   李四
            操作员   张三,王五,赵大 
可以多个人名 存在一个字段里 用逗号隔开。
现在 问题是 我要查询出来的时候  显示成

管理员  李四  
操作员   张三
操作员   王五
操作员   赵大


该怎么查询呢?求各位大大 帮忙……
优化

------解决方案--------------------
IF OBJECT_ID('tb') IS NOT NULL 

    DROP TABLE tb

GO

CREATE TABLE tb (id VARCHAR(10),col VARCHAR(30)) 

INSERT  INTO tb VALUES  ('管理员','李四') 

INSERT  INTO tb VALUES  ('操作员','张三,王五,赵大') 

go 

 

 

SELECT T1.ID

,SUBSTRING(T1.COL,T2.NUMBER,CHARINDEX(',',T1.COL+',',NUMBER)-T2.NUMBER)

FROM TB T1

INNER JOIN MASTER..SPT_VALUES T2 

ON T2.TYPE='P' AND CHARINDEX(',',','+T1.COL,T2.NUMBER)=T2.NUMBER

 

--结果:

/*
管理员 李四
操作员 张三
操作员 王五
操作员 赵大
*/

------解决方案--------------------
----------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-03-20 15:37:11
-- Version:
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
-- Jun 17 2011 00:54:03 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721)
--
----------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([职位] varchar(6),[人员] varchar(14))
insert [huang]
select '管理员','李四' union all
select '操作员','张三,王五,赵大'
--------------开始查询--------------------------

SELECT 
        a.[职位] ,
        SUBSTRING([人员], number, CHARINDEX(',', [人员] + ',', number) - number) AS [人员]
FROM    [huang] a ,
        master..spt_values
WHERE   number >= 1
        AND number < LEN([人员])
        AND type = 'p'
        AND SUBSTRING(',' + [人员], number, 1) = ','
----------------结果----------------------------
/* 
------ --------------
管理员    李四
操作员    张三
操作员    王五
操作员    赵大
*/