Du kan inte göra det med SQL
(förutom med dynamiska frågor), såvida du inte vet antalet kolumner (dvs. frågor) i designtid.
Du bör hämta den information du vill ha i tabellformat och sedan bearbeta den på klientsidan:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
eller, förmodligen, detta (i SQL Server 2005+
, Oracle 8i+
och 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
Den senare frågan ger dig resultat i det här formuläret (förutsatt att du har 4
frågor):
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
, detta kommer att mata ut data i tabellform, med rn
markerar radnumret.
Varje gång du ser rn
ändras på klienten stänger du bara <tr>
och öppna den nya.
Du kan säkert lägga din <td>
s en per resultatuppsättningsrad, eftersom samma antal eller rader garanteras returneras för varje rn
Detta är en ganska ofta ställd fråga.
SQL
bara inte ett rätt verktyg för att returnera data med dynamiskt antal kolumner.
SQL
fungerar på uppsättningar, och kolumnlayouten är en implicit egenskap hos en uppsättning.
Du bör definiera layouten för den uppsättning du vill få i designtid, precis som du definierar datatypen för en variabel i C
.
C
fungerar med strikt definierade variabler, SQL
fungerar med strikt definierade uppsättningar.
Observera att jag inte säger att det är den bästa möjliga metoden. Det är precis så SQL
fungerar.
Uppdatering:
I SQL Server
, kan du dra tabellen i HTML
formulär direkt från databasen:
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')
Se det här inlägget i min blogg för mer information:
- Dynamisk pivot