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 tirer les données que vous souhaitez en format tableau et traiter ensuite du côté client:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
ou, probablement, ce (en 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
La dernière requête vous donnera des résultats dans ce formulaire (à condition que vous avez 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
, ceci va sortir les données sous forme de tableau, avec rn
marquant le numéro de ligne.
Chaque fois que vous voyez le rn
changer sur le client, vous fermez simplement <tr>
et ouvrez le nouveau.
Vous pouvez en toute sécurité mettre VotreONE l » <td>
de par resultset ligne, puisque même nombre ou lignes est garantie à retourner pour chaque rn
Ceci est tout à fait une question souvent posée.
SQL
juste pas un bon outil pour renvoyer des données avec le 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 voulez obtenir en temps de conception, tout comme vous définissez le type de données d'une variable dans 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 fonctionne SQL
.
Mise à jour:
En SQL Server
, vous pouvez tirer la table HTML
bonne forme sur 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:
Quel serveur de base de données? – AakashM
Ce sera SQL Server. C'est toujours sanglant SQL Server. – skaffman
Oui, SQL Server. Je l'ai fait ce dont j'avais besoin pour utiliser le XML, et atteindre l'agrégation si une fonction – IThasTheAnswer