使用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? –