收录日期:2021/01/22 02:04:19 时间:2016/07/12 06:44:17 标签:疑难问题

select SystemConfig.Name SysNames,SourceRightType.Name TypeNames,Rights.Name RightNames,UserRightRValue.Type TypeValue
from SystemConfig,SourceRightType,Rights,UserRightR,UserRightRValue
where UserRightR.UserId='36245cee-f693-c001-ae4d-5b622789dedc'
and UserRightR.RightId=Rights.Id
and SourceRightType.Id=Rights.TypeId
and SystemConfig.Id=SourceRightType.SystemId
and UserRightRValue.UserRightId=UserRightR.Id
and UserRightRValue.Value=1

select 5张表,获得以下内容

Sysname typename Rightname     TypeValue
框架 权限 正式公文(无效) C
框架 权限 正式公文(无效) R
框架 权限 正式公文(无效) E
框架 权限 法律法规          C
框架 权限 法律法规          R
框架 权限 法律法规          C
框架 流程 信访管理          R
框架 流程 信访管理          E
框架 流程 信访管理          D


修改SQL如何转成
Sysname typename Rightname     TypeValue
框架 权限 正式公文(无效) CRE
框架 权限 法律法规          CR
框架 权限 法律法规          CRED





字符串聚合,是SQL Server 2000还是2005?

SQL code问题描述:
无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
  所以,当我们在处理下列要求时,会比较麻烦:
有表tb, 如下:
id    value
----- ------
1     aa
1     bb
2     aaa
2     bbb
2     ccc
需要得到结果:
id     values
------ -----------
1      aa,bb
2      aaa,bbb,ccc
即, group by id, 求 value 的和(字符串相加)

1. 旧的解决方法

-- 1. 创建处理函数
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
    DECLARE @r varchar(8000)
    SET @r = ''
    SELECT @r = @r + ',' + value
    FROM tb
    WHERE id=@id
    RETURN STUFF(@r, 1, 1, '')
END
GO
-- 调用函数

SELECt id, values=dbo.f_str(id) 
FROM tb 
GROUP BY id

-- 2. 新的解决方法 
-- 示例数据
DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'

-- 查询处理
SELECT *
FROM(
    SELECT DISTINCT 
        id
    FROM @t
)A
OUTER APPLY(
    SELECT 
        [values]= STUFF(REPLACE(REPLACE(
            (
                SELECT value FROM @t N
                WHERE id = A.id
                FOR XML AUTO
            ), '<N value="', ','), '"/>', ''), 1, 1, '')
)N

/*--结果
id          values
----------- ----------------
1           aa,bb
2           aaa,bbb,ccc
(2 行受影响)
--*/

--各种字符串分函数

--3.3.1 使用游标法进行字符串合并处理的示例。
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
--定义结果集表变量
DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))

--定义游标并进行合并处理
DECLARE tb CURSOR LOCAL
FOR
SELECT col1,col2 FROM tb ORDER BY  col1,col2
DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
OPEN tb
FETCH tb INTO @col1,@col2
SELECT @col1_old=@col1,@s=''
WHILE @@FETCH_STATUS=0
BEGIN
    IF @col1=@col1_old
        SELECT @s=@s+','+CAST(@col2 as varchar)
    ELSE
    BEGIN
        INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
        SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
    END
    FETCH tb INTO @col1,@col2
END
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb
/*--结果
col1       col2
---------- -----------
a          1,2
b          1,2,3
--*/
GO


/*==============================================*/


--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
GO

--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
    DECLARE @re varchar(100)
    SET @re=''
    SELECT @re=@re+','+CAST(col2 as varchar)
    FROM tb
    WHERE col1=@col1
    RETURN(STUFF(@re,1,1,''))
END
GO

--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1       col2
---------- -----------
a          1,2
b          1,2,3
--*/
GO

/*==============================================*/


--3.3.3 使用临时表实现字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
SELECT col1,col2=CAST(col2 as varchar(100)) 
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar(10),@col2 varchar(100)
UPDATE #t SET 
    @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
    @col1=col1,
    col2=@col2
SELECT * FROM #t
/*--更新处理后的临时表
col1       col2
---------- -------------
a          1
a          1,2
b          1
b          1,2
b          1,2,3
--*/
--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
/*--结果
col1       col2
---------- -----------
a          1,2
b          1,2,3
--*/
--删除测试
DROP TABLE tb,#t
GO


/*==============================================*/

--3.3.4.1 每组 <=2 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
    col2=CAST(MIN(col2) as varchar)
        +CASE 
            WHEN COUNT(*)=1 THEN ''
            ELSE ','+CAST(MAX(col2) as varchar)
        END
FROM tb
GROUP BY col1
DROP TABLE tb
/*--结果
col1       col2      
---------- ----------
a          1,2
b          1,2
c          3
--*/

--3.3.4.2 每组 <=3 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
    col2=CAST(MIN(col2) as varchar)
        +CASE 
            WHEN COUNT(*)=3 THEN ','
                +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
            ELSE ''
        END
        +CASE 
            WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
            ELSE ''
        END
FROM tb a
GROUP BY col1
DROP TABLE tb
/*--结果
col1       col2
---------- ------------
a          1,2
b          1,2,3
c          3
--*/
GO
if not object_id('A') is null
    drop table A
Go
Create table A([id] int,[cname] nvarchar(2))
Insert A
select 1,N'张三' union all
select 2,N'李四' union all
select 3,N'王五' union all
select 4,N'蔡六'
Go
--> --> 
 
if not object_id('B') is null
    drop table B
Go
Create table B([id] int,[cname] nvarchar(5))
Insert B
select 1,N'1,2,3' union all
select 2,N'3,4'
Go
create function F_str(@cname nvarchar(100))
returns nvarchar(100)
as
begin 
select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')>0
return @cname
end
go
select [id],dbo.F_str([cname])[cname] from B

id          cname
----------- ----------------------------------------------------------------------------------------------------
1           张三,李四,王五
2           王五,蔡六

(2 個資料列受到影響)


SQL2005,楼上的方法虽然全面,却不是我最想要的
GO
CREATE TABLE [dbo].[L](
[ID] [int] NOT NULL,
[xx] [varchar](1000) NULL,
[bb] [varchar](50) NULL
) ON [PRIMARY]

GO


insert l values(1,'1','fdsa')
insert l values(1,'1','fdsa')
insert l values(2,'2','dsfwe')
insert l values(2,'2','rewre')
insert l values(3,'5','vfds')
insert l values(3,'5','re')
insert l values(3,'5','453rds')


GO

--创建一个函数
Create function s(@id int,@xx varchar(100))
returns varchar(50)
as
begin
declare @s varchar(50)
set @s=''
select @s=@s+bb from L where id=@id and xx=@xx
return @s
end
GO


--调用函数
select id,xx,dbo.s(id,xx) from L








========================================
http://www.dbtuning.cn
主营:中小企业数据库管理、优化、调校服务
======================================== 
CREATE TABLE [dbo].[L](
    [ID] [int] NOT NULL,
    [xx] [varchar](1000) NULL,
    [bb] [varchar](50) NULL
) ON [PRIMARY]

GO


insert l values(1,'1','fdsa')
insert l values(1,'1','fdsa')
insert l values(2,'2','dsfwe')
insert l values(2,'2','rewre')
insert l values(3,'5','vfds')
insert l values(3,'5','re')
insert l values(3,'5','453rds')


GO

--创建一个函数
Create function s(@id int,@xx varchar(100))
    returns varchar(50)
as
begin
    declare @s varchar(50)
    set @s=''
    select @s=@s+bb from L where id=@id and xx=@xx
    return @s
end
GO


--调用函数
select id,xx,dbo.s(id,xx) from L order by id,xx  --忘记加分组了





========================================
http://www.dbtuning.cn
主营:中小企业数据库管理、优化、调校服务
======================================== 
SQL Server 2005解决方案一例:


DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'
-- 查询处理
SELECT *
FROM(
  SELECT DISTINCT
    id
  FROM @t
)A
OUTER APPLY(
  SELECT
    [values]= STUFF(REPLACE(REPLACE(
      (
        SELECT value FROM @t N
        WHERE id = A.id
        FOR XML AUTO
      ), '<N value="', ','), '"/>', ''), 1, 1, '')
)N/*--结果
id     values
----------- ----------------
1      aa,bb
2      aaa,bbb,ccc
(2 行受影响)
--*/

CREATE TABLE [dbo].[L](
    [ID] [int] NOT NULL,
    [xx] [varchar](1000) NULL,
    [bb] [varchar](50) NULL
) ON [PRIMARY]

GO


insert l values(1,'1','fdsa')
insert l values(1,'1','fdsa')
insert l values(2,'2','dsfwe')
insert l values(2,'2','rewre')
insert l values(3,'5','vfds')
insert l values(3,'5','re')
insert l values(3,'5','453rds')


GO

--创建一个函数
Create function s(@id int,@xx varchar(100))
    returns varchar(50)
as
begin
    declare @s varchar(50)
    set @s=''
    select @s=@s+bb from L where id=@id and xx=@xx
    return @s
end
GO


--调用函数
select id,xx,dbo.s(id,xx) from L order by id,xx --忘记加分组了







========================================
http://www.dbtuning.cn
主营:中小企业数据库管理、优化、调校服务
======================================== 
1 1 102102fdsafdsa
2 2 104104dsfwerewre
3 3 106106
3 5 vfdsre453rds
4 4 108108
5 5 110110112112
7 7 114114234324
帮顶。
用NHibernate的,而且是5张表,2005的XML方法不是很好用

请教高手,为什么我无法更改控件背景颜色(使用OnCtlColor)? 想用C#编一个telnet客户端? 广州东山、天河区哪个地方打保龄球比较便宜、环境又还可以的? 求助一段代码!! 请高指点: 在线急等! 祝大家圣诞快乐散分~~~~~~~~~~~~~~散完所有分从此别过PB,谢谢兄第们对我的帮助!!! 如何将查询到的一条记录插入另一个表中 请问广东的分数什么时候可以查? 如何用动态SQL执行这个语句? 望高手指点迷津,感激不尽! uVision2 怎么设置晶震和设定引脚状态? 求救:关于恢复win2000启动的问题,请大家救救我吧 哪位兄弟有张洪斌编著的《例解java2企业版程序设计》所附的光盘源码? 如何验证textbox所输入的只能是正整数的正则表达式? 这TM算什么?我们写程序的别成天嚷着自己苦了。。。 关于JBuildX和VSS连接的问题 爱一个人不孤单,被遗弃的感觉才孤单; 如何检测系统中是否存在某个ActiveX控件? 看看大家可以coding多少年,请对号入座 向高手兄弟们请教一下关于XP中权限的问题 SQL Server6.5安装不成功,原因何在?高分相送! 《散》《分》深夜12点!银河数码爆龙集团,利用烈火之光,向地球上发出最后一个呼唤《心情恐龙》接分!!!!!!!!!!!!!!!!! 《散》《分》深夜12点!银河数码爆龙集团,利用烈火之光,向地球上发出最后一个呼唤《心情恐龙》接分!!!!!!!!!!!!!!!!! 《散》《分》深夜12点!银河数码爆龙集团,利用烈火之光,向地球上发出最后一个呼唤《心情恐龙》接分!!!!!!!!!!!!!!!!! 《散》《分》深夜12点!银河数码爆龙集团,利用烈火之光,向地球上发出最后一个呼唤《心情恐龙》接分!!!!!!!!!!!!!!!!! 【猛虎集团】心情恐龙接分 下次软考的报考时间已经确定:5月23日。 下次软考的报考时间已经确定:5月23日! 《散》《分》深夜12点!银河数码爆龙集团,利用烈火之光,向地球上发出最后一个呼唤《心情恐龙》接分!!!!!!!!!!!!!!!!! 高分相送:我MM叫我做一个程序,一运行就可以听到她的歌。请问怎么实现啊,时间紧啊