Mit SQL
ist das nicht möglich (außer bei dynamischen Abfragen), es sei denn, Sie kennen die Anzahl der Spalten (d. h. Fragen) in der Entwurfszeit.
Sie sollten die gewünschten Daten im Tabellenformat abrufen und dann auf der Clientseite verarbeiten:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
oder wahrscheinlich dies (in SQL Server 2005+
, Oracle 8i+
und 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
Die letztere Abfrage liefert Ergebnisse in dieser Form (vorausgesetzt, Sie haben 4
Fragen):
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
, das heißt, es werden die Daten tabellarisch ausgegeben, mit rn
Markierung der Zeilennummer.
Jedes Mal, wenn Sie den rn
sehen auf dem Client ändern, schließen Sie einfach <tr>
und öffnen Sie die neue.
Sie können Ihren <td>
sicher hinterlegen ist eine pro Zeile der Ergebnismenge, da für jeden rn
garantiert dieselbe Anzahl oder Zeilen zurückgegeben werden
Dies ist eine ziemlich häufig gestellte Frage.
SQL
einfach nicht das richtige Werkzeug, um Daten mit einer dynamischen Anzahl von Spalten zurückzugeben.
SQL
arbeitet mit Mengen, und das Spaltenlayout ist eine implizite Eigenschaft einer Menge.
Sie sollten das Layout des Satzes, den Sie erhalten möchten, zur Entwurfszeit definieren, genau wie Sie den Datentyp einer Variablen in C
definieren .
C
arbeitet mit streng definierten Variablen, SQL
arbeitet mit streng definierten Mengen.
Beachten Sie, dass ich nicht sage, dass dies die bestmögliche Methode ist. Es ist einfach so SQL
funktioniert.
Aktualisierung:
In SQL Server
, können Sie die Tabelle in HTML
ziehen Formular direkt aus der Datenbank:
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')
Weitere Einzelheiten finden Sie in diesem Eintrag in meinem Blog:
- Dynamischer Drehpunkt