SQL
設計時に列数 (質問など) がわかっている場合を除き、(動的クエリを除いて)これを行うことはできません。
必要なデータを表形式で取得してから、クライアント側で処理する必要があります。
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
または、おそらくこれ ( SQL Server 2005+
、Oracle 8i+
およびPostgreSQL 8.4+
):
SELECT *
FROM (
SELECT q.*, ROW_NUMBER() OVER (ORDER BY questionID) AS rn
FROM Question q
) q
LEFT OUTER JOIN
(
SELECT r.*, ROW_NUMBER() OVER (PARTITION BY questionID ORDER BY ResponseID) AS rn
FROM Response r
) r
ON r.QuestionId = q.QuestionID
AND q.rn = r.rn
ORDER BY
q.rn, q.QuestionID
後者のクエリでは、次の形式で結果が得られます (4
質問がある場合)。
rn question response
--- --- ---
1 Question 1 Response 1.1
1 Question 2 Response 2.1
1 Question 3 Response 3.1
1 Question 4 Response 4.1
2 Question 1 Response 1.2
2 Question 2 Response 2.2
2 Question 3 NULL
2 Question 4 Response 4.2
3 Question 1 NULL
3 Question 2 NULL
3 Question 3 Response 3.3
3 Question 4 NULL
、これはrn
、行番号をマークして、データを表形式で出力します。
rn
クライアントで変更を確認するたびに<tr>
、新しいクライアントを閉じて開くだけです。
<td>
それぞれに対して同じ数または行が返されることが保証されているため、結果セット行ごとに 'sを安全に配置できます。rn
これはよくある質問です。
SQL
動的な列数でデータを返すための適切なツールではありません。
SQL
セットで動作し、列のレイアウトはセットの暗黙的なプロパティです。
で変数のデータ型を定義するのと同じように、取得するセットのレイアウトを設計時に定義する必要がありますC
。
C
厳密に定義された変数でSQL
動作し、厳密に定義されたセットで動作します。
それが最善の方法だと言っているわけではないことに注意してください。それはただのやり方SQL
です。
アップデート:
では、データベースからフォームSQL Server
内のテーブルをすぐに取得できます。HTML
WITH a AS
(
SELECT a.*, ROW_NUMBER() OVER (PARTITION BY question_id ORDER BY id) AS rn
FROM answer a
),
rows AS (
SELECT ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM answer a
WHERE question_id =
(
SELECT TOP 1 question_id
FROM answer a
GROUP BY
question_id
ORDER BY
COUNT(*) DESC
)
)
SELECT (
SELECT COALESCE(a.value, '')
FROM question q
LEFT JOIN
a
ON a.rn = rows.rn
AND a.question_id = q.id
FOR XML PATH ('td'), TYPE
) AS tr
FROM rows
FOR XML PATH(''), ROOT('table')
詳細については、私のブログのこのエントリを参照してください。