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をお使いですか? –