他の人がコメントしているように、正しい解決策は、データベーススキーマを変更して、アトミックフィールドを持つ正規化されたスキーマを持つことです。
現在のスキーマの解決策は、最初に添付ファイル フィールドを注文番号のリストに分割することです。使用可能な複数の方法のいずれかを使用します。次のステップでは、結果を id の Orders テーブルと結合して結果を取得します。3 番目のステップは、名前を連結してリストに戻すことです。分割と結合の説明については、提供されているリンクを参照してください。
以下は、3 つのステップを実行するスニペットです。
WITH
-- Numbers table for split logic
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
Numbers AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L3),
-- The join query for step 2
bodyOrders AS
(SELECT body,
o1.name orderName
FROM Numbers AS nums
INNER JOIN Communication AS valueTable
ON nums.n <= CONVERT(int, LEN(valueTable.attachment))
AND SUBSTRING(N',' + valueTable.attachment, n, 1) = N','
INNER JOIN Orders o1
ON LTRIM(RTRIM(SUBSTRING(valueTable.attachment, nums.n,
charindex(N',', valueTable.attachment + N',', nums.n) - nums.n))) = o1.id
)
-- Concatenation logic for step 3
SELECT body,
stuff( (SELECT ','+ orderName
FROM bodyOrders b2
WHERE b2.body = b1.body
ORDER BY orderName
FOR XML PATH(''), TYPE).value('.', 'varchar(5000)')
,1,1,'')
AS orderNumbers
FROM bodyOrders b1
GROUP BY body;
このスニペットは、大規模なデータ セットに対してこれを行うための最適またはパフォーマンスの高い方法を提供していません。これは、この道をたどらなければならない場合の方法の例にすぎません。
例 SQL フィドル。