使用SQL Server,您将不得不创建一个函数来协助串联和#temp表来协助后处理(以避免在整个源表中重复调用函数)。如果您转向过去10年发布的数据库平台,您将可以在您的指尖上获得更高效的解决方案。 :-)
设置:
USE tempdb;
GO
CREATE TABLE dbo.[Sample]
(
Field1 INT,
Field2 VARCHAR(32),
Field3 VARCHAR(32),
Field4 INT
);
INSERT dbo.[Sample] SELECT 1,'paper','cash', NULL
UNION ALL SELECT 2,'Paper','cash', 1
UNION ALL SELECT 3,'paper','cash', 1
UNION ALL SELECT 4,'paper','cash', NULL
UNION ALL SELECT 5,'paper','cash', 4
UNION ALL SELECT 6,'pen', 'cash', 4;
GO
功能:
CREATE FUNCTION dbo.ConcatIDs
(
@Field1 INT
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @s VARCHAR(8000);
SELECT @s = COALESCE(@s + ',', '')
+ CONVERT(VARCHAR(12), Field1)
FROM dbo.[Sample] AS s
WHERE Field4 = @Field1
AND NOT EXISTS
(
SELECT 1
FROM dbo.[Sample]
WHERE Field4 = s.Field4
AND Field1 <> s.Field1
AND (Field2 <> s.Field2 OR Field3 <> s.Field3)
);
RETURN @s;
END
GO
查询:
SELECT Field1, Field2, Field3, Field4, f4 = dbo.ConcatIDs(Field1)
INTO #x
FROM dbo.[Sample];
SELECT Field1, Field2, Field3,
[field4(all the child's id)] = '(' + f4 + ')'
FROM #x AS x1
WHERE NOT EXISTS
(
SELECT 1 FROM #x AS x2
WHERE x2.Field1 = x1.Field4
AND x2.f4 IS NOT NULL
);
DROP TABLE #x;
结果:
Field1 Field2 Field3 field4(all the child's id)
------ ------ ------ --------------------------
1 paper cash (2,3)
4 paper cash NULL
5 paper cash NULL
6 pen cash NULL
清理:
DROP TABLE dbo.[Sample];
DROP FUNCTION dbo.ConcatIDs;
请显示示例数据,所需结果并指定您正在使用的SQL Server的版本。 –
只需添加示例数据。是否有意义? – WorkerThread
请问什么版本的SQL Server? –