クエリの説明
このクエリはテーブルからカンマ区切りのリストを作成するように設計されており、FOR XML PATH 関数を利用して必要な値を含む XML フラグメントを構築します。サブクエリを使用して、指定された部門の従業員名 (ename) を取得し、XML フラグメント内のスペースをカンマに置き換えます。
<code class="language-sql">SELECT E1.deptno, allemp = Replace ((SELECT E2.ename AS 'data()' FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR xml PATH('')), ' ', ', ') FROM EMP AS e1 GROUP BY DEPTNO; </code>
FOR XML PATH の仕組み
FOR XML PATH('') は、指定された列 (この場合は ename) に基づいて emp テーブルの各行の XML フラグメントを生成します。単純な従業員テーブルがあるとします。
<code>EmployeeID Name 1 John Smith 2 Jane Doe</code>
次のクエリは XML を作成します:
<code class="language-sql">SELECT EmployeeID, Name FROM emp.Employee FOR XML PATH ('Employee');</code>
出力:
<code class="language-xml"><employee><employeeid>1</employeeid><name>John Smith</name></employee><employee><employeeid>2</employeeid><name>Jane Doe</name></employee></code>
エラー処理と代替手段
提供されたクエリは、data() を XML タグとして使用しようとしていますが、これは無効であり、エラーが発生します。これを回避するには、次の変更されたクエリを使用できます:
<code class="language-sql">SELECT E1.deptno, STUFF(( SELECT ', ' + E2.ename FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR XML PATH('') ), 1, 2, '') FROM EMP AS e1 GROUP BY DEPTNO; </code>
このクエリは、サブクエリで XML タグが作成されないようにします。また、サブクエリにカンマを追加することで、スペースを含む名前も処理します。
以上がクエリを使用して SQL Server テーブルからカンマ区切りのリストを生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。