Vous ne pouvez pas le faire avec SQL
(sauf avec les requêtes dynamiques), sauf si vous connaissez le nombre de colonnes (c'est-à-dire les questions) au moment du design.
Vous devez extraire les données souhaitées sous forme de tableau, puis les traiter côté client :
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
ou, probablement, ceci (dans SQL Server 2005+
, Oracle 8i+
et 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
Cette dernière requête vous donnera des résultats sous cette forme (à condition que vous ayez 4
questions):
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
, c'est-à-dire qu'il affichera les données sous forme de tableau, avec rn
marquer le numéro de ligne.
Chaque fois que vous voyez le rn
changeant sur le client, vous fermez simplement <tr>
et ouvrez le nouveau.
Vous pouvez mettre votre <td>
en toute sécurité est un par ligne de jeu de résultats, car le même nombre de lignes est garanti d'être renvoyé pour chaque rn
C'est une question assez fréquemment posée.
SQL
tout simplement pas un bon outil pour renvoyer des données avec un nombre dynamique de colonnes.
SQL
fonctionne sur des ensembles et la disposition des colonnes est une propriété implicite d'un ensemble.
Vous devez définir la disposition de l'ensemble que vous souhaitez obtenir au moment du design, tout comme vous définissez le type de données d'une variable en C
.
C
fonctionne avec des variables strictement définies, SQL
fonctionne avec des ensembles strictement définis.
Notez que je ne dis pas que c'est la meilleure méthode possible. C'est juste la façon dont SQL
fonctionne.
Mise à jour :
Dans SQL Server
, vous pouvez extraire le tableau en HTML
formulaire directement sorti de la base de données :
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')
Voir cette entrée dans mon blog pour plus de détails :
- Pivot dynamique