SQL
では実行できません (動的クエリを除く)設計時に列の数(つまり、質問)がわからない場合。
必要なデータを表形式でプルしてから、クライアント側で処理する必要があります:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
または、おそらくこれ( SQL Server 2005+
の場合) 、 Oracle 8i +
およびPostgreSQL8.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
が表示されるたびに クライアントで変更するには、
を閉じるだけです。 新しいものを開きます。
を安全に配置できます rn
ごとに同じ数または複数の行が返されることが保証されているため、結果セットの行ごとに1つ SQL
動的な列数のデータを返すための適切なツールではありません。 SQL
セットで動作し、列レイアウトはセットの暗黙のプロパティです。 C
で変数のデータ型を定義するのと同じように、設計時に取得するセットのレイアウトを定義する必要があります。 。 C
厳密に定義された変数、<code> 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')