(7.2.6)SQL 合并多行记录的方法总汇

时间:2022-10-25 10:26:40
--1. 创建表,添加测试数据 
CREATE TABLE tb(id int, [value] varchar(10)) 
INSERT tb 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 tb 
/**//* 
id value 
----------- ---------- 
1 aa 
1 bb 
2 aaa 
2 bbb 
2 ccc 

(5 row(s) affected) 
*/ 


--2 在SQL2000只能用自定义函数实现 
----2.1 创建合并函数fn_strSum,根据id合并value值 
GO 
CREATE FUNCTION dbo.fn_strSum(@id int) 
RETURNS varchar(8000) 
AS 
BEGIN 
DECLARE @values varchar(8000) 
SET @values = '' 
SELECT @values = @values + ',' + value FROM tb WHERE id=@id 
RETURN STUFF(@values, 1, 1, '') 
END 
GO 

-- 调用函数 
SELECT id, VALUE = dbo.fn_strSum(id) FROM tb GROUP BY id 
DROP FUNCTION dbo.fn_strSum 

----2.2 创建合并函数fn_strSum2,根据id合并value值 
GO 
CREATE FUNCTION dbo.fn_strSum2(@id int) 
RETURNS varchar(8000) 
AS 
BEGIN 
DECLARE @values varchar(8000) 
SELECT @values = isnull(@values + ',', '') + value FROM tb WHERE id=@id 
RETURN @values 
END 
GO 

-- 调用函数 
SELECT id, VALUE = dbo.fn_strSum2(id) FROM tb GROUP BY id 
DROP FUNCTION dbo.fn_strSum2 


--3 在SQL2005/SQL2008中的新解法 
----3.1 使用OUTER APPLY 
SELECT * 
FROM (SELECT DISTINCT id FROM tb) A OUTER APPLY( 
SELECT [values]= STUFF(REPLACE(REPLACE( 

SELECT value FROM tb N 
WHERE id = A.id 
FOR XML AUTO 
), '<N value="', ','), '"/>', ''), 1, 1, '') 
)N 

----3.2 使用XML 
SELECT id, [values]=STUFF((SELECT ','+[value] FROM tb t WHERE id=tb.id FOR XML PATH('')), 1, 1, '') 
FROM tb 
GROUP BY id 

--4 删除测试表tb 
drop table tb 

/**//* 
id values 
----------- -------------------- 
1 aa,bb 
2 aaa,bbb,ccc 

(2 row(s) affected) 

*/



查询数据库中所有的用户表和对应字段

查询语句查询所有用户表及其构:
SELECT TABLENAME=A.NAME,FIELDNAME=B.NAME,C.NAME,B.LENGTH FROM SYSOBJECTS A,SYSCOLUMNS B,SYSTYPES C WHERE A.ID=B.ID AND B.XTYPE=C.XTYPE AND A.TYPE='U' ORDER BY A.NAME

合并重复数据

SELECT TABLENAME, [values]=STUFF((SELECT ','+[FIELDNAME] FROM [XXXXXXXXXX] t WHERE TABLENAME=[XXXXXXXXXX].TABLENAME FOR XML PATH('')), 1, 1, '') 
into ALLTable
FROM XXXXXXXXXX
GROUP BY [TABLENAME] 

左链接查询

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP 1000 [宫格属性]
,[ALLTable].TABLENAME
      ,[表名]
      ,[中文意思]
      ,[描述/关联实体]
      ,[IS指令]
      ,[最后修改时间]
      ,[最后执行人]
      ,[含有字段]
      ,[ALLTable].[values]
  FROM [CeShiSQL].[dbo].[SQl表$] left join [CeShiSQL].[dbo].[ALLTable]
  on [CeShiSQL].[dbo].[ALLTable].TABLENAME=[CeShiSQL].[dbo].[SQl表$].表名