欢迎投稿

今日深度:

IT忍者神龟之一句sql语句——连接同一字段的所有

IT忍者神龟之一句sql语句——连接同一字段的所有值,忍者神龟sql


Oracle可以用SYS_CONNECT_BY_PATH字符串聚合函数:
SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(productname, ', ')), ', ') AS productname
FROM(
    SELECT '1' as id, productname,
        ROW_NUMBER() OVER (PARTITION BY '1' ORDER BY productname) AS curr,
        ROW_NUMBER() OVER (PARTITION BY '1' ORDER BY productname) -1 AS prev
    FROM products
    -- where 条件
    order by productname
)
START WITH curr = 1
CONNECT BY prev = PRIOR curr AND id = PRIOR id
GROUP BY id

但MS SQL 2000没有这种函数,但可以通过自定义函数或过程来实现.
-- drop function ConnectString
Create FUNCTION ConnectString( @name varchar(20) ) 
RETURNS varchar(1024) 
AS 
BEGIN 
declare @Str varchar(1024) 
set @Str = '' 
select @Str = @Str + (case when @Str = '' then '' else ',' end) + [productname] from products 
--where [productname] = @name 
return @Str 
END 
GO

-- 调用
select DISTINCT dbo.ConnectString(productname) from products

SQL Server 2005 可用OUTER APPLY:
以下是从网上摘录的:
-- 示例数据
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 行受影响)
--*/
2 Admin/ adminY/ 刘超楠/ 张伟如/ 单慧慧/
3 王亦平/ 靳麟/ 杨婧/ 运营管理部资产管理员/ 刘婷/ 钟媛/ 杜佳凝/
4 分行营业部电脑管理员A角/ 分行营业部电脑管理员B角/ 张婷婷/ 反洗钱301/ 信贷综合301/ 陈光/ 蒋喆/ 安静/ 个贷接单301/ 单立伟/ 孙晴/ 分行营业部资产管理员/ 方正/ 李晨/ 营业部企划联系人/ 李燚/
5 李娟/ 神华支行电脑管理员A角/ 神华支行电脑管理员B角/ 王国萍/ 反洗钱302/ 信贷综合302/ 张喆/ 周小舟/ 个贷接单302/ 王兆圆/ 神华支行资产管理员/ 杨厚玮/ 神华企划联系人/
6 安华支行电脑管理员A角/ 安华支行电脑管理员B角/ 魏红/ 反洗钱303/ 信贷综合303/ 陈盈/ 许越昆/ 陈醒/ 宛霞/ 个贷接单303/ 花园路支行资产管理员/ 乔曦/ 程瑶/ 花园路企划联系人/
7 西三环支行电脑管理员B角/ 西三环支行电脑管理员A角/ 张永风/ 反洗钱304/ 信贷综合304/ 邓立/ 个贷接单304/ 张纪洪/ 龚鑫/ 李冬冬(304)/ 崔佳/ 西三环支行资产管理员/ 周琪/ 李菲/ 西三环企划联系人/ 张鑫/
8 董钧玉/ 中关村支行电脑管理员B角/ 中关村支行电脑管理员A角/ 李鑫/ 反洗钱305/ 信贷综合305/ 个贷接单305/ 徐文文/ 旦蕊/ 中关村支行资产管理员/ 贾晋平/ 张莹01/ 车帅/ 中关村企划联系人/


一句sql语句:连接同一字段的所有值

你用的数据库是什么?MS SQL,还是Oracle,...?不同的数据库的写法会有很大出入的

Oracle可以用SYS_CONNECT_BY_PATH字符串聚合函数:
SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(productname, ', ')), ', ') AS productname
FROM(
SELECT '1' as id, productname,
ROW_NUMBER() OVER (PARTITION BY '1' ORDER BY productname) AS curr,
ROW_NUMBER() OVER (PARTITION BY '1' ORDER BY productname) -1 AS prev
FROM products
-- where 条件
order by productname
)
START WITH curr = 1
CONNECT BY prev = PRIOR curr AND id = PRIOR id
GROUP BY id

但MS SQL 2000没有这种函数,但可以通过自定义函数或过程来实现.
-- drop function ConnectString
Create FUNCTION ConnectString( @name varchar(20) )
RETURNS varchar(1024)
AS
BEGIN
declare @Str varchar(1024)
set @Str = ''
select @Str = @Str + (case when @Str = '' then '' else ',' end) + [productname] from products
--where [productname] = @name
return @Str
END
GO

-- 调用
select DISTINCT dbo.ConnectString(productname) from products

SQL Server 2005 可用OUTER APPLY:
以下是从网上摘录的:
-- 示例数据
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
......余下全文>>
 

更改同一字段下的多条记录为同一个值的SQL语句、、、、?

update 表名 set 字段名=同一个那个值 where 你的多条记录共同符合的条件
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/4470.html NewsArticle IT忍者神龟之一句sql语句——连接同一字段的所有值,忍者神龟sql Oracle可以用SYS_CONNECT_BY_PATH字符串聚合函数:SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(productname, ', ')), ', ') AS productnameFROM( SELECT '1' as...
评论暂时关闭