Non puoi farlo con SQL
(tranne per le query dinamiche), a meno che tu non conosca il numero di colonne (ad es. domande) in fase di progettazione.
Dovresti estrarre i dati che desideri in formato tabulare e quindi elaborarli sul lato client:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
o, probabilmente, questo (in SQL Server 2005+
, Oracle 8i+
e 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
Quest'ultima query ti darà risultati in questo modulo (a condizione che tu abbia 4
domande):
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
, questo produrrà i dati in forma tabellare, con rn
segnando il numero di riga.
Ogni volta che vedi il rn
cambiando sul client, chiudi semplicemente <tr>
e apri quello nuovo.
Puoi tranquillamente inserire il tuo <td>
è uno per riga del set di risultati, poiché è garantito che vengano restituiti lo stesso numero o le stesse righe per ogni rn
Questa è una domanda abbastanza frequente.
SQL
semplicemente non è uno strumento giusto per restituire dati con numero dinamico di colonne.
SQL
opera sugli insiemi e il layout delle colonne è una proprietà implicita di un insieme.
Dovresti definire il layout del set che vuoi ottenere in fase di progettazione, proprio come definisci il tipo di dati di una variabile in C
.
C
funziona con variabili rigorosamente definite, SQL
funziona con insiemi rigorosamente definiti.
Nota che non sto dicendo che sia il miglior metodo possibile. È solo il modo in cui SQL
funziona.
Aggiornamento:
In SQL Server
, puoi estrarre la tabella in HTML
modulo direttamente dal database:
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')
Vedi questa voce nel mio blog per maggiori dettagli:
- Perno dinamico