Du kan ikke gøre det med SQL
(undtagen med dynamiske forespørgsler), medmindre du kender antallet af kolonner (dvs. spørgsmål) i designtid.
Du skal trække de ønskede data i tabelformat og derefter behandle dem på klientsiden:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
eller sandsynligvis dette (i SQL Server 2005+
, Oracle 8i+
og 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
Sidstnævnte forespørgsel vil give dig resultater i denne formular (forudsat at du har 4
). spørgsmål):
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
, dette er, at den udsender dataene i tabelform med rn
markering af rækkenummeret.
Hver gang du ser
Du kan roligt indsætte din
Dette er et ret ofte stillet spørgsmål.
Du bør definere layoutet for det sæt, du ønsker at få i designtid, ligesom du definerer datatypen for en variabel i
Bemærk, at jeg ikke siger, at det er den bedst mulige metode. Det er bare sådan
Opdatering:
I
Se dette indlæg i min blog for flere detaljer:rn
ændres på klienten, lukker du bare og åbn den nye. 's én pr. resultatsætrække, da samme antal eller rækker med garanti returneres for hver rn
SQL
bare ikke et rigtigt værktøj til at returnere data med dynamisk antal kolonner.SQL
fungerer på sæt, og kolonnelayoutet er en implicit egenskab for et sæt.C
.C
arbejder med strengt definerede variable, SQL
fungerer med strengt definerede sæt.SQL
virker.SQL-server
, kan du trække tabellen i HTML
formular lige ud af 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')